文章目录
一. 什么是Flyway
flyway 是一个敏捷工具,用于数据库的移植。采用 Java 开发,支持所有兼容 JDBC 的数据库。
主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据。
二. 为什么需要Flyway
在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题。
其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:
- 自己写的SQL忘了在所有环境执行。
- 别人写的SQL我们不能确定是否都在所有环境执行过了。
- 有人修改了已经执行过的SQL,期望再次执行。
- 需要新增环境做数据迁移。
- 每次发版需要手动控制先发DB版本,再发布应用版本。
- 其它场景。
三. Flyway 如何工作
- 项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。
- 初次使用时,flyway会创建一个 flyway_schema_history 表,用于记录sql执行记录
- Flyway会扫描项目指定路径下(默认是 classpath:db/migration )的所有sql脚本,与 flyway_schema_history 表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。
- 如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。
四. SpringBoot集成
1. 依赖导入(Maven 方式)
1.1 新增 Properties版本号约束
<properties>
<flyway.version>8.5.13</flyway.version>
<flyway-db.version>8.5.12</flyway-db.version>
</properties>
1.2 新增依赖
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flyway.version}</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>${flyway-db.version}</version>
</dependency>
</dependencies>
2. 配置文件导入
文件索引编号, 根据具体配置文件而定, 去当前最大索引值+1
- bootstrap.properteis
# 关联flyway配置文件
spring.profiles.include=flyway
- 新增配置文件 -> bootstrap-flyway.properties
# ================== [ Flyway Profile ] ==================
# 当迁移发现数据库非空并且没有元数据的表时, 自动执行基准迁移, 新建schema_version表
spring.flyway.baseline-on-migrate=true
# 是否启用
spring.flyway.enabled=true
# 文件魔码格式
spring.flyway.encoding=UTF-8
# 文件默认地址
spring.flyway.locations=classpath:db_migration
# 默认前缀
spring.flyway.sql-migration-prefix=V
# 默认分隔符
spring.flyway.sql-migration-separator=__
# 默认后缀
spring.flyway.sql-migration-suffixes=.sql
# 是否启动校验
spring.flyway.validate-on-migrate=true
# 禁用删表
spring.flyway.clean-disabled=true
# 自定义版本控制表名
spring.flyway.table=db_vcs
3. 新增配置文件夹
3.1. 新增本地SQL脚本存放文件夹
新增文件夹名称需要与配置项 [ spring.flyway.locations ] 保持一直
- resources 目录下新增文件夹 db_migration
- resources 目录下新增文件夹 1.0.0
3.2 新增初始化脚本SQL
此处以 saas_cloud_aggregation 库为例
- 导出指定数据库结构与数据 Structure+ Data
- 存储为 V1.0.0__Init.sql
- 文件结构描述, 所有sql文件都必须遵循以下所有规则
- V -> 表示版本空值(大写)
- 1.0.0 -> 表示版本号(不允许重复, 有小到大)
- __ -> 双下划线, 表示分隔符 (需要与配置 [ spring.flyway.sql-migration-separator ] 保持一致)
- Init -> 版本描述, 写能看懂的描述即可
- .sql -> 文件后缀
- 文件结构描述, 所有sql文件都必须遵循以下所有规则
- 导出文件转移至 db_migration/${version} 文件夹下
- 修改字符集编码为utf8mb4
4. 启动服务
- 控制台日志打印, 出现此日志, 说明集成成功
- 观察数据库