Flyway 使用说明
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脚本的规范:
配置示例
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 等环境,这些环境中你有没有遇到如下混乱的局面:
这个数据库上的数据处于什么状态?
这个脚本是否已经被执行过了?
生产中环境修复的问题在其他环境修复了吗?
如何快速启动一个新的数据库实例?
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 表示该脚本未执行成功,可手动删除该条记录 ,重新启动程序