# db-migration-test **Repository Path**: senvon/db-migration-test ## Basic Information - **Project Name**: db-migration-test - **Description**: db-migration工具的使用示例 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-10-30 - **Last Updated**: 2023-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # db-migration 数据库迁移工具 使用说明 ## 背景 有如下场景,如果有工具的存在会很舒服 * 有客户现场不能人工在生产上执行脚本 * 密码策略更新,需要对数据库的用户名密码重刷 * 产品升级导致的数据迁移 * 升级过程可控,可回滚 一般部分IT产品,整个生命周期可能超过10年,在这个过程中,会持续不断的优化升级和改进.这种情况下,工具的使用价值就会很大. 另外,db-migration提供了自动化执行的功能,所以会限制sql脚本的编写和存储,从而形成关于sql脚本的规范,也能最大程度避免人为操作风险. 最后,工具默认集成qilu-license,license有效时间为6个月,且内部有单个sql脚本不能超过2000行的限制,用于生产超过请谨慎使用. ## 打包脚本 ``` mvn clean package -s ./settings-hw.xml ``` 有依赖jar包需要额外下载 如果出现nexus.9istock.com服务器异常,请私信我,应该是nexus挂了. 如果出现SSL错误,nexus使用https搭建. 请在命令行增加参数 ``` mvn clean package -s ./settings-hw.xml -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true ``` 解压缩target/xxx.zip 修改conf/application.yml,修改配置中的数据源,目前只测试过mysql和oracle 执行命令 ./run.bat 另外,windows下的powerShell,会出现识别maven参数异常,导致的编译错误,请换其他的cmd工具使用 ## 规约 ### 工具文件说明 文件夹|说明 -|- conf|为springboot配置文件夹,有工具启动的配置和日志 sql|为产品升级准备的脚本文件 lib|依赖包 target|工具生成的文件目录 run.*|执行脚本 ### 配置说明 整体配置在conf/application.yml下面 ``` db-migration: sql-dir: ./sql #数据库文件的目录 db-type: MYSQL #数据库类型,默认MYSQL,可选值 ORACLE,MSSQL,POSTGRE 大小写敏感,而且会决定脚本文件地址,切记大写 base-version: 1.0.0 #没有数据库的时候,描述当前的版本 config-location: ./conf #配置文件的地址 dump: count-enable: false #dump命令的时候,不打印表数据量 versionMap: - version: 1.0.2 stepList: - stepName: init #一定要和脚本内的step名称匹配,否则会新增step doExecuteItem: callback: step2DO #步骤升级callback undoExecuteItem: callback: step2UNDO #步骤回滚callback - stepName: new-senvon #通过配置创建一个步骤,不执行脚本 order: 3 #通过配置创建的步骤,设置顺序 doExecuteItem: callback: testHandler1 #步骤升级callback ``` sql-dir 为sql文件所在目录的配置,相对对执行bat/sh文件夹而言,可以是一个相对路径. db-type 为数据库类型设置,一般不同的数据库,DDL脚本存在较大差异 base-version 为当前升级包的版本,一般伴随产品版本发布,该配置及其重要,在下面很多命令中有使用到 config-location 工具配置文件地址,用于读取db-migration初始化脚本 dump.count-enable dump命令,是否执行count语句,默认=true,dump命令在扫描数据库表以后,会执行全表count查询,打印表数据量 versionMap 工具扩展开发配置,db-migration支持callback,开发人员可以在当前工程内进行开发,通过versionMap的配置,插入到step中执行 callback的执行会被纳入到step的事务中,如果callback有异常,且当前step在事务中,就会触发当前step的事务回滚 callback callback的二次开发类在spring中的beanId或者beanName db-migration一般从sql-dir中,扫描sql文件,创建执行步骤.有的场景还是需要部分简单的编码来实现刷数据库的目的,比如加密机的访问. 通过对yml的配置,可以实现在step前后,执行某些java代码 也可以通过yml的配置,创建一个没有脚本,只有callback的step,同上面的new-senvon的示例,新的step没有脚本中的order,需要手动设置. ### sql文件规约 ``` db-migration sql oracle 1.0.1 ----带版本号,为增量脚本 顺序__名称__错误策略__事务类型__脚本类型.sql 1__init__NE__DDL__DO.sql 1__init__NE__DDL__UNDO.sql ALL ----ALL命名,为全量脚本 1__init__NE__DDL__DO.sql ``` sql的脚本文件,分为2个文件夹进行存储,在sql文件夹内,第一层目录为版本目录,用户记录不同的版本 位置|说明 -|- 顺序|一个版本里面包含多个脚本,顺序决定了执行顺序,从1开始,数值越大,优先级越低 名称|step的名称,很重要,同一个版本内,step名称不能重复,如果有callback的程序,step是用来匹配的关键字 错误策略|当step执行异常时,会不会终止执行. 可选值,EE:异常停止,NE:忽略异常,继续执行 事务类型|当前step是否需要事务支持, 可选值,DDL:不需要,DML:需要 脚本类型|用于标识当前脚本为升级脚本还是降级脚本,可以选值 DO: 升级脚本,UNDO: 降级脚本 一个版本有多个步骤,一个步骤可以关联一个升级脚本和对应的回滚脚本,一个升级callback和回滚callback 回滚脚本和回滚callback,可以为空. 如果步骤在执行过程中出现异常情况,会出现以下几种情况 1. 如果当前的步骤使用事务,则当前事务会回滚,一个步骤下的所有操作,都会回滚 2. 如果错误策略是NE,忽略异常,则会跳过当前的错误的语句,继续执行后续的语句和步骤 3. 如果错误策略是EE,异常停止,则会在事务策略以后,选择抛出当前语句的错误,终止后续的执行,执行记录Execute和Detail状态会被设置为ERROR,这个时候,可能是脚本问题,在修改脚本以后,可以使用`continue`命令继续当前的操作,如果是升级异常,也可以使用`cancel`命令,回滚到当前操作的BaseVersion和ToVersion之间的某一个版本. 4. 一旦Execute状态被设置为ERROR,则不再支持执行`up`和`down`命令,一定要先修复当前的异常记录,才能正常执行 ### sql脚本的分隔符 通过sql脚本执行存储过程/函数的创建,一般会用到分隔符(delimiter) db-migration默认分隔符为 `;` 工具自定义分隔符切换关键字 `@DELIMITER %%% ;` 上面语句的含义为,将解析sql分隔符由`;`切换为`%%%` 在分隔符使用结束,建议手动切换回来 , 具体操作为`@DELIMITER ; %%% ` 详细请看代码示例中的`1__init__NE__DDL__DO.sql`文件的操作. ## 使用说明 工具使用SpringShell2.1.x版本构建,支持TAB,命令自动补全. ### 命令简介 模块|命令|说明 -|-|- springShell|help|springShell内置命令,可以看到工具内所有命令及使用方式 springShell|clear|springShell内置命令,清空当前工具命令行 springShell|quit|springShell内置命令,退出工具 展示|show-version|展示工具能看到的版本 展示|show-execute|展示执行记录 展示|show_detail|需要executeId参数,展示execute的详细过程 工具包查看|pack|工具包内包含的版本信息查看 工具包查看|pack-detail|工具包内包含的版本详细信息 工具包查看|plan|可选版本参数,展示由当前版本迁移到目标版本的执行详细情况 执行|init|初始化db-migration,使用工具内置脚本,在工具连接的数据库中创建表 执行|up|系统升级,可选版本参数,分析版本差异,按照分析结果顺序,执行版本升级 执行|down|系统降级,需要版本参数,分析版本差异,按照分析结果顺序,执行版本降级 执行|continue|当升级或者降级过程中,出现异常,且终止执行,continue命令为,修改脚本以后,继续之前的执行 执行|cancel|可选版本参数,当升级过程中出现异常,且终止执行,cancel命令为,回滚到某一个版本 执行|new-all|执行全量脚本,并初始化db-migration工具,默认版本使用`0.0.0` 工具|dump|输出数据库结构的text文件,可以使用text工具进行比对操作,文件保存在target目录内 ### show-version 版本查看命令 show-version命令,没有任何限制,可以直接执行.用于展示目前所有的版本信息 命令示例 `show-version` 执行示例 ``` 2023-10-26 11:41:49,654 [0MP4Cj0I8iyY5n2] - the command is [showVersion] begin , parameter:[] 2023-10-26 11:41:49,836 [0MP4Cj0I8iyY5n2] - ┌─────────────────┬─────────────────────────────────┐ │Type │Version │ ┝━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │migration-version│1.0.0 │ ├─────────────────┼─────────────────────────────────┤ │package-version │1.0.0 │ ├─────────────────┼─────────────────────────────────┤ │project │no version found(Not Initialized)│ └─────────────────┴─────────────────────────────────┘ ``` migration-version 为当前db-migration工具的版本 package-version,为当前产品升级包的版本 projet,为目标数据库中,产品的版本 project显示Not Initialized,表示db-migration工具的表没有初始化,工具没有初始化,无法执行业务操作,包含up,down,continue,cancel,show-execute和show-detail命令 当执行init命令以后,project会显示为 Initialized ### show-execute 执行历史查看 show-execute用于查看当前库中,执行过的历史信息,按照执行顺序,降序排列 命令示例 `show-execute` 执行示例 ``` 2023-10-26 12:14:26,057 [HKHAvQeGRHrE41F] - the command is [showExecute] begin , parameter:[] 2023-10-26 12:14:26,062 [HKHAvQeGRHrE41F] - ┌───────────────┬────────────┬──────────┬───────────┬───────┬────────────────────────────┐ │ExecuteId │Base-Version│To-Version│ExecuteType│Status │Time │ ┝━━━━━━━━━━━━━━━┿━━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │uyqz0ot92oK56Xw│1.0.0 │1.0.1 │DO │SUCCESS│Thu Oct 26 12:14:22 CST 2023│ └───────────────┴────────────┴──────────┴───────────┴───────┴────────────────────────────┘ 2023-10-26 12:14:26,063 [HKHAvQeGRHrE41F] - the command [showExecute] end ``` 字段说明 字段|含义 -|- ExecuteId|执行批次号,每次敲命令都会生成一个traceNo,只有当up,down才会记录 Base-Version|系统中原有的版本号 To-Version|目标版本号 ExecuteType|执行操作,DO升级 or UNDO降级 Status|执行的状态,SUCCESS:成功,ERROR:异常 Time|执行时间 ### show-detail 执行历史明细查看 命令示例 `show-detail uyqz0ot92oK56Xw` 需要参数executeId,从show-execute列表中获取 执行示例 ``` shell:>show-detail uyqz0ot92oK56Xw 2023-10-26 12:18:21,616 [] - discard long time none received connection. , jdbcUrl : jdbc:mysql://anolis.vm:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false, version : 1.2.8, lastPacketReceivedIdleMillis : 235558 2023-10-26 12:18:21,624 [Gzqe2ijPGdaBA0q] - the command is [showDetail] begin , parameter:[uyqz0ot92oK56Xw] 2023-10-26 12:18:21,631 [Gzqe2ijPGdaBA0q] - ┌───────────────┬───────┬─────────┬───────────┬──────────────────────────────────────┬────────┬───────────┬──────────┬───────┬────────────────────────────┬────────────────────────────┐ │ExecuteId │Version│Step-Name│ExecuteType│Script-File │Callback│Ignor-Error│Result-Msg│Status │Create-Time │Update-Time │ ┝━━━━━━━━━━━━━━━┿━━━━━━━┿━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ │uyqz0ot92oK56Xw│1.0.1 │insert │DO │MYSQL/1.0.1/2__insert__NE__DML__DO.sql│ │NE │SUCCESS │SUCCESS│Thu Oct 26 12:14:22 CST 2023│Thu Oct 26 12:14:22 CST 2023│ ├───────────────┼───────┼─────────┼───────────┼──────────────────────────────────────┼────────┼───────────┼──────────┼───────┼────────────────────────────┼────────────────────────────┤ │uyqz0ot92oK56Xw│1.0.1 │init │DO │MYSQL/1.0.1/1__init__NE__DDL__DO.sql │ │NE │SUCCESS │SUCCESS│Thu Oct 26 12:14:22 CST 2023│Thu Oct 26 12:14:22 CST 2023│ └───────────────┴───────┴─────────┴───────────┴──────────────────────────────────────┴────────┴───────────┴──────────┴───────┴────────────────────────────┴────────────────────────────┘ 2023-10-26 12:18:21,633 [Gzqe2ijPGdaBA0q] - the command [showDetail] end ``` 工具会返回在一个up或者down操作过程中,所有的步骤和明细 字段说明 字段|含义 -|- ExecuteId|执行批次号,每次敲命令都会生成一个traceNo,只有当up,down才会记录 Version|执行步骤的版本号 step-Name|步骤名称 ExecuteType|执行类型 Script-File|脚本文件的路径 Callback|callback的名称 Ignor-Error|错误策略,EE,异常停止,NE,忽略错误 In-Transaction|当前步骤是否使用事务 Result-Msg|执行返回消息 Status|执行状态 ### plan 执行计划 在具体执行升级 or 降级前,可以让工具按照升级包的脚本规划执行步骤并展示. 命令示例 `plan 1.0.3` `1.0.3` 是版本号,可选值,如果没有版本号,默认使用工具包内的最新版本,默认做升级操作. 执行示例 ``` shell:>plan 1.0.3 2023-10-26 12:24:08,675 [tcrM6G4J4MhOqNM] - the command is [plan] begin , parameter:[1.0.3] 2023-10-26 12:24:08,678 [tcrM6G4J4MhOqNM] - the product version is 1.0.1 2023-10-26 12:24:08,679 [tcrM6G4J4MhOqNM] - the target version is 1.0.3 2023-10-26 12:24:08,679 [tcrM6G4J4MhOqNM] - the target version [1.0.3] is greater than product version [1.0.1] , this is upgrade plan 2023-10-26 12:24:08,681 [tcrM6G4J4MhOqNM] - version:1.0.2 stepList is ┌───────┬─────────┬─────┬──────────────────────────────────────┬───────────┬──────────┬──────────────┬────────────────────────────────────────┬─────────────┐ │Version│Step-Name│Order│DO-File │DO-Callback│Error-Type│In-Transaction│UNDO-File │UNDO-Callback│ ┝━━━━━━━┿━━━━━━━━━┿━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━┥ │1.0.2 │init │1 │MYSQL/1.0.2/1__init__NE__DDL__DO.sql │ │NE │false │MYSQL/1.0.2/1__init__NE__DDL__UNDO.sql │ │ ├───────┼─────────┼─────┼──────────────────────────────────────┼───────────┼──────────┼──────────────┼────────────────────────────────────────┼─────────────┤ │1.0.2 │insert │2 │MYSQL/1.0.2/2__insert__NE__DML__DO.sql│ │NE │true │MYSQL/1.0.2/2__insert__NE__DML__UNDO.sql│ │ └───────┴─────────┴─────┴──────────────────────────────────────┴───────────┴──────────┴──────────────┴────────────────────────────────────────┴─────────────┘ version:1.0.3 stepList is ┌───────┬─────────┬─────┬──────────────────────────────────────┬───────────┬──────────┬──────────────┬────────────────────────────────────────┬─────────────┐ │Version│Step-Name│Order│DO-File │DO-Callback│Error-Type│In-Transaction│UNDO-File │UNDO-Callback│ ┝━━━━━━━┿━━━━━━━━━┿━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━┥ │1.0.3 │init │1 │MYSQL/1.0.3/1__init__NE__DDL__DO.sql │ │NE │false │MYSQL/1.0.3/1__init__NE__DDL__UNDO.sql │ │ ├───────┼─────────┼─────┼──────────────────────────────────────┼───────────┼──────────┼──────────────┼────────────────────────────────────────┼─────────────┤ │1.0.3 │insert │2 │MYSQL/1.0.3/2__insert__NE__DML__DO.sql│ │NE │true │MYSQL/1.0.3/2__insert__NE__DML__UNDO.sql│ │ └───────┴─────────┴─────┴──────────────────────────────────────┴───────────┴──────────┴──────────────┴────────────────────────────────────────┴─────────────┘ 2023-10-26 12:24:08,682 [tcrM6G4J4MhOqNM] - the command [plan] end ``` 如果系统版本号为1.0.11,可以使用`plan 1.0.9` 查看当前系统版本降级为1.0.9版本的执行情况 ### init 工具初始化 db-migration需要使用数据库,对数据库的版本信息进行存储. init命令将会使用内置的sql,动态在目标数据源中创建对应的表. 在application.yml配置的数据库中,创建`QILU_DBMIGRATION_DETAIL`和`QILU_DBMIGRATION_EXECUTION`2张表. ### up 版本升级 需要数据库先被工具初始化,已经执行过init命令. 命令示例 `up 1.0.2` `1.0.2`为pack中的版本,需要高于数据库中当前的版本.版本参数可选,如果不填,这使用配置中的baseVersion版本执行. 执行示例 ``` shell:>up 1.0.1 2023-10-26 12:14:20,370 [] - discard long time none received connection. , jdbcUrl : jdbc:mysql://anolis.vm:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false, version : 1.2.8, lastPacketReceivedIdleMillis : 1274671 2023-10-26 12:14:20,381 [uyqz0ot92oK56Xw] - the command is [up] begin , parameter:[1.0.1] 2023-10-26 12:14:20,386 [uyqz0ot92oK56Xw] - the product version is 1.0.0 2023-10-26 12:14:20,386 [uyqz0ot92oK56Xw] - the target version is 1.0.1 2023-10-26 12:14:20,390 [uyqz0ot92oK56Xw] - upgrade ready to execute stepList 2023-10-26 12:14:20,394 [uyqz0ot92oK56Xw] - ┌───────┬─────────┬─────┬──────────────────────────────────────┬───────────┬──────────┬──────────────┬────────────────────────────────────────┬─────────────┐ │Version│Step-Name│Order│DO-File │DO-Callback│Error-Type│In-Transaction│UNDO-File │UNDO-Callback│ ┝━━━━━━━┿━━━━━━━━━┿━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━┥ │1.0.1 │init │1 │MYSQL/1.0.1/1__init__NE__DDL__DO.sql │ │NE │false │MYSQL/1.0.1/1__init__NE__DDL__UNDO.sql │ │ ├───────┼─────────┼─────┼──────────────────────────────────────┼───────────┼──────────┼──────────────┼────────────────────────────────────────┼─────────────┤ │1.0.1 │insert │2 │MYSQL/1.0.1/2__insert__NE__DML__DO.sql│ │NE │true │MYSQL/1.0.1/2__insert__NE__DML__UNDO.sql│ │ └───────┴─────────┴─────┴──────────────────────────────────────┴───────────┴──────────┴──────────────┴────────────────────────────────────────┴─────────────┘ can you confirm execute upgrade operation to 1.0.1 [y/n]:y 2023-10-26 12:14:21,874 [uyqz0ot92oK56Xw] - =============ready to execute DO executeId:uyqz0ot92oK56Xw for step:1.0.1-init ============ 2023-10-26 12:14:21,877 [uyqz0ot92oK56Xw] - sql=drop table if exists sys_config_info 2023-10-26 12:14:21,883 [uyqz0ot92oK56Xw] - sql=create table sys_config_info ``` up命令首先打印plan,会进行二次确认,回复'y','yes' 则进行执行 否则,退出当前命令,不执行操作. up以后,show-version命令,能看到project的版本会升级为目标版本号 ### down 版本降级 需要数据库先被工具初始化,已经执行过init命令. 命令示例 `down 1.0.0` `1.0.0`为pack中的版本,需要低于数据库中当前的版本.版本参数可选,如果版本参数为空,使用上一次成功执行记录的toVersion作为回滚版本,如果没有上一条记录,使用baseVersion. 执行示例 ``` shell:>down 1.0.0 2023-10-26 13:16:20,143 [] - discard long time none received connection. , jdbcUrl : jdbc:mysql://anolis.vm:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false, version : 1.2.8, lastPacketReceivedIdleMillis : 311574 2023-10-26 13:16:20,153 [xn2G7RJzcdJdHoA] - the command is [down] begin , parameter:[1.0.0] 2023-10-26 13:16:20,159 [xn2G7RJzcdJdHoA] - the product version is 1.0.1 2023-10-26 13:16:20,159 [xn2G7RJzcdJdHoA] - the target version is 1.0.0 2023-10-26 13:16:20,165 [xn2G7RJzcdJdHoA] - down ready to execute stepList 2023-10-26 13:16:20,167 [xn2G7RJzcdJdHoA] - ┌───────┬─────────┬─────┬──────────────────────────────────────┬───────────┬──────────┬──────────────┬────────────────────────────────────────┬─────────────┐ │Version│Step-Name│Order│DO-File │DO-Callback│Error-Type│In-Transaction│UNDO-File │UNDO-Callback│ ┝━━━━━━━┿━━━━━━━━━┿━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━┥ │1.0.1 │insert │2 │MYSQL/1.0.1/2__insert__NE__DML__DO.sql│ │NE │true │MYSQL/1.0.1/2__insert__NE__DML__UNDO.sql│ │ ├───────┼─────────┼─────┼──────────────────────────────────────┼───────────┼──────────┼──────────────┼────────────────────────────────────────┼─────────────┤ │1.0.1 │init │1 │MYSQL/1.0.1/1__init__NE__DDL__DO.sql │ │NE │false │MYSQL/1.0.1/1__init__NE__DDL__UNDO.sql │ │ └───────┴─────────┴─────┴──────────────────────────────────────┴───────────┴──────────┴──────────────┴────────────────────────────────────────┴─────────────┘ can you confirm execute cancel operation [y/n]:y 2023-10-26 13:16:21,787 [xn2G7RJzcdJdHoA] - =============ready to execute UNDO executeId:xn2G7RJzcdJdHoA for step:1.0.1-insert ============ 2023-10-26 13:16:21,789 [xn2G7RJzcdJdHoA] - sql=delete from sys_config_info where config_name = 'admin' ``` down命令首先打印plan,会进行二次确认,回复'y','yes' 则进行执行 否则,退出当前命令,不执行操作. down以后,show-version命令,能看到project的版本会降级为目标版本号 ### contunue 继续操作 在执行up或者down的操作过程中,可能会出现异常,且不能忽略.比如,脚本异常,这个时候需要修改当前的脚本,然后继续执行. 命令示例 `contunue` 只有当之前存在ERROR的执行记录时,才能执行continue操作. continue操作会从原有的执行计划中,过滤掉已经执行成功的,然后继续执行,会生成新的Detail记录,但是ExecuteId和之前的操作保持一致. ### cancel 取消操作 在执行up的过程中,出现终止性异常,不希望升级,回退到某一个版本. 只有存在升级且异常的执行记录,才能执行cancel命令 命令示例 `cancel 1.0.3` '1.0.3'为可选的版本参数,需要在执行记录的baseVersion和ToVersion中间的任意版本号.如果没有版本号,默认使用之前执行记录的baseVersion值. ### new-all 执行全量 执行工具包内的`sql/数据库类型/xx.sql`所有脚本,作为全量sql执行. 该命令执行前会检查数据库有没有被db-migration初始化,如果没有,会执行初始化操作. ### dump 数据库结构打印 使用jdbc,对全量的数据库结构进行打印,生成text文件,后续可以使用文本比对工具,对不同版本的数据库进行比对操作. dump打印的内容包括,表,列,数据类型,索引,视图,存储过程,函数和自定义对象. 经过测试,部分数据库驱动对于JDBC的支持程度不一样,数据库中自定义对象存在缺失,我无法解决,看后面驱动升级吧. ### 二次开发接口 db-migration支持二次开发,详细请看配置和示例代码(com.istock.base.handler包内的类) ```java public interface MigrationCallback { /**执行脚本的回调 * @throws Exception */ default public void pre() { } /**执行脚本后的回调 * @throws Exception */ default public void post() { } } ``` 实现`MigrationCallback`接口,注入到spring中,就能在yml配置文件中进行配置,step执行的时候,就会正常打印出来 ## 总结 在执行前,所有脚本必须被测试,类似开发的代码一样,没有经过测试的脚本,都是在瞎搞. 该工程最大的价值,不是一个db-migration工具的使用,也不是因为工具而产生了sql脚本规范,而是整个工程结构和以往你说经历的所有结构都不一样.因为这个工程结构同时满足了以下需求 1. 工程是给出源码的,对开发人员友好,可以随便开发,感觉想干嘛就能干嘛 2. 核心部分被license加密,核心代码不存在泄密问题,也不存在被替换的问题 3. 项目又能正常打包,正常运行,支持各种CI/CD工具 有一个程序,完全正常运行,你能知道是干啥的,你也有部分源码能影响程序的实现,就是有部分黑盒运行在内部,不知道也不清楚这个黑盒子怎么玩的 这就是这套结构厉害的地方.同时满足了个性化开发和核心逻辑的隐藏.