数据库版本控制工具--flyway
一. 什么是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.0baseline-version: 1.0# 是否开启flyway,默认true.enabled: true# 设置迁移时的编码,默认UTF-8.encoding: UTF-8# 当读取元数据表时是否忽略错误的迁移,默认false.ignore-failed-future-migration: false# 迁移脚本的位置,默认db/migration.locations: classpath:/flyway# 迁移时是否校验,默认为truevalidate-on-migrate: true# flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。clean-disabled: true# 验证错误时 是否自动清除数据库 高危操作!clean-on-validation-error: false#配置 Flyway 以允许非顺序迁移out-of-order: true
补充数据库相关的配置:
spring:datasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为 masterprimary: masterdatasource:# 主库数据源master:type: your_connect_pooldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/your_databaseusername: your_usernamepassword: 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脚本。