logo
一、 Flyway介绍
Flyway的定位:数据库的版本控制。
Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更(DDL和DML语句),Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate(迁移)。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。
使用Flyway帮助用户完成数据库迁移的工作,Flyway可以从任意一个数据库版本自动迁移到最新版本,由于迁移脚本和代码同步提交,从而保证代码和数据库时刻匹配。
二、为什么要用Flyway
随着项目的不断迭代,数据库表结构、数据都在发生着变化。甚至有的业务在多环境版本并行运行。数据为王的时代,管理好数据库的版本也成为了迫切的需要。如何能做到像 Git 之类的版本控制工具来管理数据库?Java 项目中常用 Flyway 和 Liquibase 来管理数据库版本。其中 Flyway 相对来说比较受欢迎。
在真实的项目开发中,我们每个人都会有一个应用软件和与其相对应的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我的本地有一套软件和相应的数据库系统,另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当中去。其实道理和Git合并代码一样的道理,当2个人或多个同时修改了一份代码那么我们如何进行数据库同步?在比如我们如果修改了脚本那么如何同步测试环境和生产环境,以上那么变得非常麻烦,现在就用到了我们的flyway。
三、 Flyway的工作模式
介绍Flyway是如何工作的,也可以理解为Flyway的数据库升级方案。
Flyway可以对数据库进行升级,从任意一个版本升级到最新的版本。但是升级的依据是用户自己编写的sql脚本,用户自己决定每一个版本的升级内容。
Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的命名规范要求:
image
版本号可以使用小版本,如V1.1。
具体要求:
版本号和版本描述之间,使用两个下划线分隔。
版本描述之间,使用一个下划线分隔单词。
版本号唯一:不允许多个脚本文件有相同的版本号。
使用Flyway升级,会自动创建一张历史记录表:flyway_schema_history。
这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果:
meta表数据截图
Flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。如果flyway检测到发生了变化,则抛出错误,并终止升级。
如果已经执行过的脚本没有发生变化,Flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。
所以,Flyway总是幂等的,而且可以支持跨版本的升级。
如果你好奇,Flyway如何检查脚本文件的内容是否有修改。你可以注意以下记录表中有一个字段checksum,它记录了脚本文件的校验和。flyway通过比对文件的校验和来检测文件的内容是否变更。
使用上面的方式,升级一个空的数据库,或者在一直使用Flyway升级方案的数据库上进行升级,都不会又问题。但是,如果在已有的数据库引入Flyway,就需要一些额外的工作。
Flyway检测数据库中是否有历史记录表,没有则代表是第一次升级。此时,flyway要求数据库是空的,并拒绝对数据库进行升级。
你可以设置baseline-on-migrate参数为true,flyway会自动将当前的数据库记录为V1版本,然后执行升级脚本。这也表示用户所准备的脚本中,V1版本的脚本会被跳过,只有V1之后的版本才会被执行。
四、Flyway 的“潜”规则
4.1 SQL文件执行顺序
Flyway 是如何