# migration **Repository Path**: dachuansite/migration ## Basic Information - **Project Name**: migration - **Description**: 数据库脚本迁移工具,支持国产化数据库,支持多数据源。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2022-12-06 - **Last Updated**: 2024-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目遵循约定大约配置的原则 1. 系统支持多数据库、多数据源【不同数据库数据源】 1. 脚本文件夹一级目录为`数据库名称`【数据库名称使用标准的数据库产品名称,获取方式如下:】 ```java website.dachuan.migration.utils.DatabaseIdProvider.DatabaseId ``` 1. 系统支持根据不同业务模块拆分脚本文件并且不同业务模块之间的版本不存在关联性 1. 脚本升级是否支持事务与数据引擎是否支持ddl事务息息相关,数据库支持ddl事务则在脚本执行异常时系统可以对所有执行脚本进行回滚,如果数据库不支持ddl事务系统会标记当前执行失败sql文件,待改进后从新启动系统即可。 1. 系统支持多数据源,系统在spring容器中会自动获取当前容器中的所有数据源信息,并根据数据源自动选择脚本执行 1. 系统支持4中模式 ```text 1 数据库初始化模式[空数据库][创建版本控制表并执行所有脚本] 2 版本管理初始化[数据库非空,但无版本控制表及基线][创建版本控制表,并自动添加基线,根据基线执行基线之后的所有脚本] 3 基线初始化[数据库非空,存在版本控制表无基线][自动添加基线,根据基线执行基线之后的所有脚本] 4 数据脚本更新模式[根据各个模块执行成功的最新版本号,执行之后的所有脚本] ``` 1. 数据库版本控制基线的说明,版本控制表中只存在一条版本控制基线,所有模块的基线版本都基于此。 1. 系统支持多租户模式下,数据脚本的自动执行,在多租户模式是数据脚本存放路径与表结构变更脚本在不同路径下 ```text 1 公共数据脚本,各个租户都需要执行的数据脚本,系统自动为数据脚本增加租户信息 2 租户个性化数据,只在特定租户中执行的数据脚本,数据脚本存放文件夹使用租户号命名 3 超级租户数据脚本,只在主数据源执行,当前脚本组要设置租户号,数据脚本存放路径默认为:_st_ ``` 1. 特别注意: ```text 非多租户模式下数据脚本存放路径与表结构变更脚本在同一根路径下,并且两中脚本可以混合在同一文件中; 在多租户模式是数据脚本存放路径与表结构变更脚本在不同路径下,并且两种类型脚本不可相互混合 ``` 1. 存量脚本与增量脚本的问题 ```text 存量脚本与增量脚本为同一路径,存量脚本统一存放在deploy_init目录下 deploy_init 目录下的脚本可以分模块也可以不分模块 初始化脚本的版本号系统默认为1.0.0 ``` # 系统当前适配数据 1. PostgreSQL 1. HighGo 1. MySQL 1. Oracle 1. DMDBMS # 系统当前适配数据源 1. com.baomidou.dynamic.datasource.DynamicRoutingDataSource 1. com.alibaba.druid.pool.DruidDataSource # sql文件命名规则 脚本命名规则 [V]`可自定`开头 [__]`可自定义` 分割符号 主版本号.此版本号.补丁版本号 [.sql]`可自定义`文件后缀 ```text V__0.0.1__create_user.sql ``` # 在sql文件夹下可以根据业务类型进行拆分 ```text migration |---MySQL |---deploy_init |---deploy_init_.sql |---sys |---V__1.0.1__sys.sql |---task |---V__1.0.1__task.sql |---PostgreSQL |---sys |---V__1.0.0__sys.sql |---task |---V__1.0.0__task.sql ``` # 多租户模式下数据脚本路径梳理 ```text tenant-data |---MySQL |---common |---V__1.0.1__sys.sql |---tenant_id_1 |---V__1.0.1__task.sql |---tenant_id_2 |---V__1.0.1__task.sql |---PostgreSQL |---common |---V__1.0.1__sys.sql |---tenant_id_1 |---V__1.0.1__task.sql |---tenant_id_2 |---V__1.0.1__task.sql ``` # 数据是否支持 ddl事务 ```text 不支持:[MySQL、Oracle、DMDBMS] 支持:[PostgreSQL、HighGo] ``` # 问题排查 1 postgreSQL create sequence 异常 ```text 系统在使用`druid`数据源中开启`wall filter`后在执行创建sequence语句时只支持通用关键字,不支持数据库方言。 解决方案: 1. 关闭wall 或者设置 jvm参数 -Ddruid.wall.logViolation=true -Ddruid.wall.throwException=false 2. 使用常规语法 create sequence name_seq increment by 1 start with 1 cache 10; ``` 2 文件夹中文件存放策略 ```text 1. 初始化文件夹 deploy_init 下可以分模块存档脚本,初始化文件夹下sql文件没有版本号,系统执行脚本时默认将其赋值为1.0.0 version字段为文件名md516位字符串 2. 增量脚本文件中(区分模块或者不区分模块)sql文件必须存在版本号且相同文件夹下版本号不能重复 ``` ```postgresql CREATE TABLE sys_tenant ( tenant_id bigserial NOT NULL, tenant_code varchar(36) NOT NULL, tenant_name varchar(100) NOT NULL, expire_date timestamp(6), status int4 NOT NULL DEFAULT 1, creator varchar(20), create_date timestamp(6), create_dept varchar(200), updater varchar(20), update_date timestamp(6), update_dept varchar(200), independent_db int4, driver varchar(32), url varchar(128), username varchar(32), password varchar(64), modules varchar(128), PRIMARY KEY (tenant_id) ) ; COMMENT ON COLUMN sys_tenant.tenant_id IS '租户id'; COMMENT ON COLUMN sys_tenant.tenant_code IS '租户编码'; COMMENT ON COLUMN sys_tenant.tenant_name IS '租户名称'; COMMENT ON COLUMN sys_tenant.expire_date IS '过期时间'; COMMENT ON COLUMN sys_tenant.status IS '1:正常;2:冻结;3:过期'; COMMENT ON COLUMN sys_tenant.creator IS '创建人'; COMMENT ON COLUMN sys_tenant.create_date IS '创建时间'; COMMENT ON COLUMN sys_tenant.create_dept IS '创建机构'; COMMENT ON COLUMN sys_tenant.updater IS '更新人'; COMMENT ON COLUMN sys_tenant.update_date IS '更新时间'; COMMENT ON COLUMN sys_tenant.update_dept IS '更新机构'; COMMENT ON COLUMN sys_tenant.independent_db IS '租户独立数据源(1:是,0否)'; COMMENT ON COLUMN sys_tenant.driver IS '数据库驱动'; COMMENT ON COLUMN sys_tenant.url IS '数据库连接url'; COMMENT ON COLUMN sys_tenant.username IS '数据库连接用户名'; COMMENT ON COLUMN sys_tenant.password IS '数据库连接密码'; COMMENT ON COLUMN sys_tenant.modules IS '租户开通模块'; COMMENT ON TABLE sys_tenant IS '系统租户表'; ```