跳至主要內容

Flyway 使用说明

Mr.Vincent大约 4 分钟开发指引web

1、介绍

Flyway是一款数据库迁移(migration)工具 ,数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。

1、项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。

2、初次使用时,Flyway会创建一个flyway_schema_history表,用于记录sql执行记录。

3、Flyway会扫描项目指定路径下(默认是classpath:db/migration)的所有sql脚本,与flyway_schema_history 表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。

4、如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。

sql脚本的规范:

V+版本号(版本号的数字间以"."或"_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,

例如:V2017.9.30__Update.sql

例如:V1__INIT_DATABASE.sql

2、项目使用Flyway

1.引入MySQL数据库驱动依赖等,并且需要引入Flyway依赖:

<!--引入flyway-->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

2.Flyway常用配置:

配置项是否必填说明
spring.flyway.enabled是否启用flyway, 默认TRUE
spring.flyway.encoding编码格式,默认UTF-8
spring.flyway.locations迁移sql脚本文件存放路径,默认db/migration
spring.flyway.sql-migration-prefix迁移sql脚本文件名称的前缀,默认V
spring.flyway. sql-migration-separator迁移sql脚本文件名称的分隔符,默认2个下划线__
spring.flyway. sql-migration-suffixes迁移sql脚本文件名称的后缀 默认.sql
spring.flyway. validate-on-migrate迁移时是否进行校验,默认true

如使用默认配置则配置文件可以不添加任何配置。

3、根据在配置文件的脚本存放路径的配置,在resource目录下建立文件夹db/migration

4、添加需要运行的sql脚本。sql脚本的命名规范请参照sql脚本的规范:

img

配置示例

spring:
    flyway:
        # 启用或禁用 flyway
        enabled: true
        # 字符编码 默认 UTF-8
        encoding: UTF-8
        # 执行迁移时是否自动调用验证
        validate-on-migrate: true
        # 禁止清理数据库表
        cleanDisabled  : true
        # 如果数据库不是空表,需要设置成 true,否则启动报错
        baselineOnMigrate: true
        # 与 baseline-on-migrate: true 搭配使用
        baselineVersion: 0
        # 脚本位置(默认)
        locations: classpath:db/migration

3、为什么用Flyway?

随着团队项目逐渐进行,出现了多种测试环境,用以不同的目的,例如 Test、UAT、Product,Dev 等环境,这些环境中你有没有遇到如下混乱的局面:

  1. 这个数据库上的数据处于什么状态?

  2. 这个脚本是否已经被执行过了?

  3. 生产中环境修复的问题在其他环境修复了吗?

  4. 如何快速启动一个新的数据库实例?

4、注意

1.Flyway 清空数据库操作太过危险,怎么禁用?

答设置参数 spring.flyway.clean-disabled :true

2.如启动发生 Migration checksum mismatch for migration version xxx 怎么办 ?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version xxx
-> Applied to database : 1062144176
-> Resolved locally : 1432425380

答: 因为修改已经执行过的老脚本的内容会导致此错误,可以还原老脚本内容,重新按规范建一个sql脚本执行

3.Flyway支持版本降级吗?

答:不支持

4.发生 Detected failed migration to version ,怎么办?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed: 
Detected failed migration to version 4 (msg xxxx)

答: 该错误时由于 插入数据抛出异常导致 Flyway 迁移失败, 如发现flyway_schema_history 中success字段为0 表示该脚本未执行成功,可手动删除该条记录 ,重新启动程序