官网
简介
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
在Maven中集成并使用
Maven中引入Flyway插件与MySQL整合
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>6.2.4</version>
<configuration>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false</url>
<user>root</user>
<password>root</password>
<locations>
<location>filesystem:src/main/resources/db/migration</location>
</locations>
<table>flyway_schema_history</table>
<sqlMigrationPrefix>V</sqlMigrationPrefix>
<undoSqlMigrationPrefix>U</undoSqlMigrationPrefix>
<repeatableSqlMigrationPrefix>R</repeatableSqlMigrationPrefix>
<sqlMigrationSeparator>__</sqlMigrationSeparator>
<sqlMigrationSuffixes>.sql</sqlMigrationSuffixes>
<encoding>UTF-8</encoding>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
</plugin>
configuration
配置简介
参数 | 是否必须 | 默认值 | 描述 |
---|---|---|---|
driver | 否 | 会根据数据库连接自动判断 | 用于连接数据库的jdbc驱动 |
url | 是 | – | 连接数据库的链接,对特殊符号需要进行转义。例如:& 需要转为& |
user | 否 | – | 数据库账号名 |
password | 否 | – | 数据库账号密码 |
locations | 否 | filesystem:src/main/resources/db/migration | 指定数据库迁移sql执行脚本路径。有两种配置方式:1.通过classpath :指定类路径的包地址。2.通过filesystem :从项目的跟目录开始填写路径 |
table | 否 | flyway_schema_history | 记录flyway框架执行的历史记录名称,库中没有会自动创建 |
sqlMigrationPrefix | 否 | V | 版本化SQL迁移文件名前缀,一般sql脚本的命名规范为前缀+版本号+分割符+描述+后缀 。例如V1.1__Create_new_table.sql |
undoSqlMigrationPrefix | 否 | U | 撤销SQL迁移的脚本文件名前缀。撤销与该脚本具有相同版本号的SQL迁移文件造成的影响。文件命名结构:前缀+版本号+分割符+描述+后缀 。例如:U1.1__Undo.sql 。此配置仅限于商业版可用,社区版不可用 |
repeatableSqlMigrationPrefix | 否 | R | 可重复执行的SQL迁移脚本,命名规范:前缀+分割符+描述+后缀 。例如:R__Repea_run.sql |
sqlMigrationSeparator | 否 | __ | SQL迁移的文件名分隔符。注意是双下划线而不是一个 |
sqlMigrationSuffixes | 否 | .sql | SQL迁移文件后缀。文件命名结构:V1.1__Add_data.sql 。可以指定多个后缀。例如: .sql,.pkg,.pkd 。方便与其他工具兼容 |
encoding | 否 | UTF-8 | 指定SQL脚本编码格式 |
- 更多配置可参考官网
使用
mvn flyway:migrate
迁移
将架构迁移到最新版本。 如果flyway_schema_history
不存在,它将自动创建架构历史记录表。
迁移是Flyway工作流程的核心。它将扫描文件列表或类路径以获取可用的迁移。它将它们与已应用于数据库的迁移进行比较。如果发现任何差异,它将迁移数据库以缩小差距。
迁移最好在应用程序启动时执行,以避免数据库和代码期望之间的任何不兼容性。
执行迁移是幂等的,并且可以安全地完成迁移,而不管架构的当前版本如何。
- 示例1:我们具有9版之前的迁移功能,并且数据库的版本为5版。
迁移将依次应用迁移6、7、8和9。- 示例2:我们提供了版本9之前的可用迁移,并且数据库的版本为9。
迁移不执行任何操作。以上内容原自官网,使用Google翻译进行的机翻
-
在
src/main/resources/db/migration
目录下创建第一个sql迁移脚本V1.0__Create_user_table.sql
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP, `valid` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否有效 0.有效 1.无效', `delete_time` datetime(0) NULL DEFAULT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号名称', `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '加密后密码', `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码盐值', `admin_role_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色id(多个使用,号隔开)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户表' ROW_FORMAT = Compact;
-
输入maven命令
mvn compile flyway:migrate
,可以看到控制台打印,执行成功
-
可以查看数据库发现除了
user
表外还多了一张flyway_schema_history
表(图1),这张表中保存了每次执行migration
的记录(图2)
-
当再次执行
mvn compile flyway:migrate
命令时,控制台会打印,目前数据库处于最新版本,无需进行迁移
-
可以再创建一个sql脚本
V1.1__ADD_data_to_user.sql
来向user表中添加数据:INSERT INTO `test`.`user`(`delete_time`, `name`, `password`, `salt`, `admin_role_ids`) VALUES ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11'), ('2020-04-10 11:10:09', '11', '11', '11', '11')
-
再次执行
mvn compile flyway:migrate
命令,查看控制台,可以看到flyway自动检测到了版本更新,并执行了添加脚本将数据添加到user表中
mvn flyway:clean
清除所有表
删除已配置数据库中的所有表。
clean对与在开发和测试中有很大的帮助。这样当再执行migrate
迁移命令时会重新创建表,可以避免在测试中出现的一些脏数据影响代码逻辑。
- 在线上环境中慎用
mvn flyway:info
打印迁移信息
打印有关所有迁移的详细信息和状态信息。
mvn flyway:validate
校验
用于校验,范围包括已升级的脚本是否改名,已执行的版本内容是否修改。所有针对已执行的版本进行的改动都会导致校验失败。
-
执行migrate会自动进行校验,如果失败将不会做任何的migrate。
-
flyway希望用户提供的脚本是稳定的,以免造成额外的复杂性和混乱。
mvn flyway:undo
撤销
撤消最近应用的版本迁移。
mvn flyway:baseline
基准
对现有数据库进行基准测试,如果不存在flyway_schema_history
文件,则会直接创建,并以当前状态为版本1
mvn flyway:repair
修复
修复Flyway模式历史记录表。这将执行以下操作:
- 在没有DDL事务的数据库上删除所有失败的迁移
(留下的用户对象仍必须手动清理) - 将可用迁移的校验和,描述和类型与可用迁移重新对齐
参考 官网