最近群里在讨论一个问题:
在进行版本升级时,Sql不兼容,数据库升级经常报错,需要重复对比哪里执行过了。这种问题如何解决?
其实这个问题是一个非常常见的问题,几乎所有的开发都会遇到,可能大家的解决方法不一而足。但是在《持续交付·发布可靠软件的系统方法》一书中已经给我们提供了最好的方案,那就是版本控制(详见《持续交付》第十二章“数据管理”)。
书中给我们推荐了几款用于数据库版本控制的工具,如用来做数据对比的DBdiff、数据迁移的DBmigrate等。但是对于Java开发者来说,还有一个更加好的数据库版本控制和迁移工具,就是Flyway。
Flyway 是什么
Flyway是一个开源的数据库迁移(migration)工具,其主张简单(simplicity)和约定(convention),而非使用配置(configuration)。我们可以通过官网(https://flywaydb.org)了解其使用方式。
Flyway主要提供7个基本命令,如Migrate、Clean、Info、Validate、Undo、Baseline、Repair,可以使用SQL或Java方式编写迁移,提供命令行客户端工具和Java API,同时提供Maven、Gradle、SpringBoot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja等插件支持。
Flyway基本可支持所有类型的数据库,如Oracle、SqlServer、DB2、Mysql、MariaDB、SQLite等,其脚本的格式是V 版本号 双下划线 描述 结束符(.sql),如V1__Initial_Setup.sql。
Flyway在首次启动会默认创建名为SCHEMA_VERSION的元素局表,表中保存了版本、描述、要执行的sql脚本等,该表是用于记录所有版本演化和状态的MetaData表。如下图所示:
在数据迁移时,Flyway会再次扫描文件系统,根据该元数据表检查迁移,如果它们的版本号小于或等于标记为当前版本的版本号,则会忽略它们。在每次数据迁移时,Flyway会同步更新该元数据表,通过元数据和初始状态,我们就可以轻易完成数据库的迁移。
命令解释:
Migrate:
将Schema迁移至最新版本。在Migrate时,Flyway会检查MetaData数据表,如果不存在则会创建。Migrate会扫描指定文件系统或路径下的Migrations,然后将其于MetaData表中标记为当前版本的记录对比,进行版本升级。
Clean:
删掉数据库Schema中所有元素队形,包括表结构、视图、存储过程等,在开发和测试阶段有很大用处。
Info:
打印关于迁移中所有的细节和状态数据。该命令能够让我们知道当前所处位置,了解哪些迁移过程已经被执行,哪些仍处于挂起(pending)状态,同时知道迁移命令执行成功与否。
Validate:
参照可用的迁移验证当前已完成的迁移。该命令可帮助我们验证应用于数据库的迁移是否与本地的迁移相匹配。通过对比MetaData表与本地Migrations的CheckNum值,如果相同则验证通过,否则验证失败。
Undo:
撤销最近一次的迁移。如果指定目标版本,Flyway会尝试按应用顺序撤销版本化的迁移。
Baseline:
对已经存在的数据库Schema版本化的解决方案。即在一个非空数据库新建MetaData表,并把Migrations应用到该数据库。一般用于没有使用Flyway的数据库需要引入Flyway的场景,这将导致Migrate忽略含当前基线版本(Baseline Version)之前所有版本的迁移,但不影响新的版本迁移。
Repair:
修复元数据表。主要用于如下场景:
· 移除所有失败的migration。
· 将已应用的迁移中CheckSum、描述、类型和可用的迁移对齐
· 将所有缺少的迁移标记为已删除。
以上仅是对基本命令做了简单解释,详细的使用方法还要参考Flyway官网。
SpringBoot中使用Flyway
1.添加Maven依赖
Flyway Maven插件支持Maven 3.x、Java8、Java9、Java10、Java11、Java12.
备注:在Flyway官网上使用<plugin>引用Flyway,在Maven仓库中使用<dependency>引用Flyway,两种方式在使用上没有区别。
添加依赖后,我们就可以在Maven项目中看到Flyway提供的基础命令:
2.开启Flyway支持并配置Flyway
3. 在resource目录下创建migration目录
按照第二步中指定的sql脚本位置创建目录,将需要执行的sql脚本放在该目录下,启动SpingBoot即可进行数据迁移。
4. 验证是否成功
启动项目,此时可以查看启动日志或连接数据库验证执行结果。由于我本机未安装Mysql Server,因此就不再启动验证。
Flyway工具可以帮助我们保证数据库迁移过程的有序,按照约定方式命名和书写sql,实则与持续集成、持续交付中要求的“一切均要版本控制”的理念相得益彰。