一. 什么是Flyway
Flyway 是一款开源的数据库迁移工具。它采用简单直观的方式管理数据库变更,通过版本化的迁移脚本确保数据库结构的一致性和可重复性。无论是开发环境、测试环境还是生产环境,Flyway 都能确保数据库变更按照预期顺序执行,避免手动修改数据库带来的风险。
二. Flyway 原理简介
- 识别当前版本:通过
flyway_schema_history
表检查数据库当前版本。 - 比对迁移脚本:将文件系统或类路径中的迁移脚本与已执行的历史记录进行比对。
- 执行未应用的脚本:按照版本号顺序执行所有未应用的迁移脚本。
- 记录执行结果:将执行成功的脚本信息记录到
flyway_schema_history
表中。
三.Flyway应用场景
- 团队协作开发:确保团队成员使用一致的数据库结构。
- CI/CD 流水线:自动化数据库变更,实现环境一致性。
- 多环境部署:开发、测试、生产环境使用相同的变更脚本。
- 数据库重构:安全地执行大规模数据库重构。
- 开源项目维护:方便贡献者同步数据库结构。
四.Spring boot 集成Flyway
1. 添加依赖
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>9.16.3</version>
</dependency>
2.flyway配置:
flyway:
# 是否自动执行基准迁移,
# 当 baseline-on-migrate 设为 false(这是默认值)时,Flyway 遇到未管理的数据库就会报错,不会自动进行基线操作。
# 当 baseline-on-migrate 设为 true 时,如果 Flyway 发现数据库里没有 flyway_schema_history 表(也就是该数据库还没被 Flyway 管理过),它会先执行基线操作,再进行迁移。
#基线操作会创建 flyway_schema_history 表,并且记录所有版本低于 baseline-version(默认是 1)的迁移脚本,将它们标记为已执行。
baseline-on-migrate: true
# baseline的版本号,默认为1.0
baseline-version: 1.0
# 是否开启flyway,默认true.
enabled: true
# 设置迁移时的编码,默认UTF-8.
encoding: UTF-8
# 当读取元数据表时是否忽略错误的迁移,默认false.
ignore-failed-future-migration: false
# 迁移脚本的位置,默认db/migration.
locations: classpath:/flyway
# 迁移时是否校验,默认为true
validate-on-migrate: true
# flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。
clean-disabled: true
# 验证错误时 是否自动清除数据库 高危操作!
clean-on-validation-error: false
#配置 Flyway 以允许非顺序迁移
out-of-order: true
补充数据库相关的配置:
spring:
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
datasource:
# 主库数据源
master:
type: your_connect_pool
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/your_database
username: your_username
password: your_password
3.取消集成Flyway
当flyway的依赖和配置是在公共配置里,如果某一个微服务不使用数据库,不需要集成Flyway,即可在该微服务的启动类中添加exclude
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
@SpringBootApplication(exclude = FlywayAutoConfiguration.class)
4.添加SQL脚本
根据配置locations指定的位置创建sql脚本文件,如:V1__Create_User_Table.sql
注意,迁移脚本的名字必须遵循以下规则:必须是以V字母开头,然后放版本号(小数点有多少个不限制),然后是2个下划线(必须两个下划线),最后接上版本描述,必须以sql作为后缀名。
当微服务执行时,flyway会根据flyway_schema_history中记录的脚本执行情况,执行对应的SQL脚本。