当前位置: 首页 > 科技观察

数据库迁移神器——Flyway

时间:2023-03-19 19:21:50 科技观察

本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。大家好,我是阿芬。不知道大家有没有遇到过这样的场景。一套代码部署在不同的环境中。随着时间的推移,每个环境中的代码都有不同的版本。版本控制,但往往很容易忘记在数据库层面进行更新!前言比如一开始环境A和环境B的代码版本是一样的,但是随着版本的迭代,环境A的系统一直在不断迭代,但是环境B的系统由于各种原因没有升级,一直保持原来的版本。如果某个时候需要升级环境B的系统,你会发现中间出现了很多版本,每个版本之间的差距非常大,数据库结构已经调整,无法打包发布直接地。调整后的SQL必须在环境B执行一次,这时候如果SQL版本做得好,问题不大,顺序执行即可,但如果中间有人遗留或遗漏记录,就可以只有比较数据库结构才能解决。数据迁移我们前面提到的场景的专业术语叫做数据迁移,那么为什么会有数据迁移场景呢?我从官网上截了图,大家可以看看。虽然可能和我实际开发的不太一样,但是和这种场景差不多,有多个环境。可见虽然我们的代码可以通过版本迭代来控制,但是我们的数据库却不行。很多时候,我们甚至会忘记脚本是否已经执行。这种事情,光靠人是很难记住的。FlywayFlyway就是这样一个用来解决数据库迁移的工具。连接Flyway后,会在数据库中生成一个名为flyway_schema_history的默认数据表,用来跟踪数据库的变化。程序启动时,Flyway会在文件系统或类路径下寻找迁移脚本。每个迁移步骤都有相应的命名规则。Flyway会根据文件的版本号进行迁移。每次迁移后,都会在flyway_schema_history表中插入一条类似如下的记录,记录该记录版本对应的脚本文件和校验信息。:每次启动只会执行版本最高的脚本,如果版本没变,改了脚本就不会启动。Flyway的迁移类型最常见的版本迁移类型是版本化迁移。每个迁移都会对应一个迁移版本。迁移后的版本必须是全局唯一的。版本迁移最大的特点就是只按顺序执行。撤消迁移每一次撤消迁移对应一个版本迁移,也就是说版本迁移存在撤消迁移,每一次撤消迁移和版本迁移是一一对应的,对应的版本号必须一致。RepeatableMigrationRepeatableMigration有描述和验证码,但是没有版本号。每次启动程序,如果脚本文件有变化,就会执行。基于SQL的迁移上述类型都是基于SQL文件执行的,但是每种类型的命名格式不同。下图截自官网。让我们来看看每种类型的文件。按照下面的格式来命令,其中分隔符是两个下划线。主要分为以下几个部分:prefix:前缀,不同的类型使用不同的前缀,版本迁移使用V,undo迁移使用U,可重复迁移使用R,当然这些都是可以配置的;version:版本号,可以使用点符号或单下划线链接;Separator:分隔符,两个下划线,也可配置;描述:版本描述可以用下划线和空格分隔;Suffix:后缀,一般是.sqlSpringBoot项目接入FlywaySpringBoot项目接入Flyway很简单,主要分为以下几个步骤,我们依次来看一下。添加依赖org.flywaydbflyway-core将以上依赖添加到项目的pom.xml文件中。添加配置#启用flywayspring.flyway.enabled=true#禁止清理数据表spring.flyway.clean-disabled=true#是否已经有数据库spring.flyway.baseline-on-migrate=true#基础版本号,递增反过来春天。flyway.baseline-version=0#迁移脚本存放的位置spring.flyway.locations=classpath:db/migration这里是因为很多时候我们并不是作为一个新项目开始使用Flyway,而是在迭代中引入项目,所以上面的配置spring.flyway.clean-disabled=true必须禁用。上面的配置配置起来非常简单,因为已经继承到SpringBoot中了。迁移脚本文件脚本的命名规则遵循上述,我们这里使用版本迁移。我们创建一个版本的SQL文件,放在对应的类路径文件夹下,文件名为V1.2__create_test_table.sql,文件内容如下,然后我们启动工程。CREATETABLE`test_table`(`id`int(11)NULLCOMMENT'ID',`name`varchar(255)NULLCOMMENT'Name');在启动过程中,我们看到如下日志,显示了当前版本和迁移后的版本。让我们再次检查数据库。首先,test_table已经成功创建。另外,我们在查看flyway_schema_history表的时候,会发现多了一个版本数据。至此,我们已经成功介入Flyway。小结今天阿粉介绍一款数据库版本迁移的工具。这么好的工具请赶快用起来,让你在以后的版本迭代过程中永远不会忘记执行SQL。本文首先介绍了Flyway的使用,我们会在下一篇分享其实现原理。