需求:
目前环境太多套,而且每套的代码版本都是不一致的,再分支升级版本的时候每次都需要处理数据库的sql脚本,用人工核对容易出错或遗漏,为避免sql脚本混乱,需要统一的数据版本工具来进行维护。当前公司生产使用sql审核平台,除了生产环境的以外,各公司机房之间的版本希望通过数据版本控制。
方案:使用Flyway数据版本控制
方案介绍:
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
官方网站:https://flywaydb.org/
首先先了解下数据版本说明:
Flyway 将 SQL 文件分为 Versioned 、Repeatable 和 Undo 三种:
- Versioned 用于版本升级, 每个版本有唯一的版本号并只能执行一次.
- Repeatable 可重复执行, 当 Flyway检测到 Repeatable 类型的 SQL 脚本的
checksum
有变动, Flyway 就会重新应用该脚本. 它并不用于版本更新, 这类的migration
总是在 Versioned 执行之后才被执行。 - Undo 用于撤销具有相同版本的版本化迁移带来的影响。但是该回滚过于粗暴,过于机械化,一般不推荐使用。一般建议使用 Versioned 模式来解决。
这三种的命名规则如下图:
-
Prefix 可配置,前缀标识,默认值
V
表示 Versioned,R
表示 Repeatable,U
表示 Undo -
Version 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点
.
或下划线_
-
Separator 可配置, 用于分隔版本标识与描述信息, 默认为两个下划线
__
-
Description 描述信息, 文字之间可以用下划线
_
或空格 ``分隔 -
Suffix 可配置, 后续标识, 默认为
.sql
目前系统项目基本使用Versioned 就行,其他类型了解下就行。
项目集成
Flyway已经集成到spring的actuate中因此集成非常方便
-
第一步,在
pom.xml
中增加flyway的依赖:<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
注意版本号之前
-
第二步,
application.yml
文件中配置Flyway,定义SQL脚本的在项目的路径(更多参数参考:https://flywaydb.org/documentation/configuration/parameters/)flyway:table: schema_version #Flyway表名locations: classpath:db,db/** #脚本路径enabled: true # 因为生产使用sql审核平台,因此生产环境Flyway启用关闭(这点很重要)outOfOrder: true # 允许无序执行,会执行之前旧版本新加的sql 默认falseignoreMissingMigrations: true #db记录但没脚本 默认falseignoreIgnoredMigrations: true #有脚本db没记录 默认false
-
第三步,按Flyway的规范创建版本化的SQL脚本
- 在工程的
src/main/resources
目录下创建db
目录 - 在
db
目录下创建版本化的SQL脚本 - 版本号规范 V版本号__姓名_日期_类型.sql 例如:V1.9.0.0__name_20210623_ddl.sql
- 在工程的
公司的额外注意事项:
1、 因为公司的mysql是使用的开源分支mariaDB,因此url需要增加useMysqlMetadata=true参数才能使用Flyway
2、Sql脚本最好在上线前才提交到远程git,免得开发同伴频繁修改造成文件checksum比对不上
3、同一版本sql类型ddl跟dml最好分开,用小版本号区分就行