flyway入门使用教程

官网

https://flywaydb.org/

简介

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

在Maven中集成并使用

Maven中引入Flyway插件与MySQL整合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<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&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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 连接数据库的链接,对特殊符号需要进行转义。例如:&需要转为&amp;
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迁移

Gjrr3q.png

将架构迁移到最新版本。 如果flyway_schema_history不存在,它将自动创建架构历史记录表。

迁移是Flyway工作流程的核心。它将扫描文件列表或类路径以获取可用的迁移。它将它们与已应用于数据库的迁移进行比较。如果发现任何差异,它将迁移数据库以缩小差距。

迁移最好在应用程序启动时执行,以避免数据库和代码期望之间的任何不兼容性。

执行迁移是幂等的,并且可以安全地完成迁移,而不管架构的当前版本如何。

  • 示例1:我们具有9版之前的迁移功能,并且数据库的版本为5版。
    迁移将依次应用迁移6、7、8和9。

  • 示例2:我们提供了版本9之前的可用迁移,并且数据库的版本为9。
    迁移不执行任何操作。

    以上内容原自官网,使用Google翻译进行的机翻

  1. src/main/resources/db/migration目录下创建第一个sql迁移脚本V1.0__Create_user_table.sql

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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;
  2. 输入maven命令mvn compile flyway:migrate,可以看到控制台打印,执行成功
    GjdQbj.png

  3. 可以查看数据库发现除了user表外还多了一张flyway_schema_history表(图1),这张表中保存了每次执行migration的记录(图2)
    图1

图2

  1. 当再次执行mvn compile flyway:migrate命令时,控制台会打印,目前数据库处于最新版本,无需进行迁移
    Gj0ZjS.png

  2. 可以再创建一个sql脚本V1.1__ADD_data_to_user.sql来向user表中添加数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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')
  1. 再次执行mvn compile flyway:migrate命令,查看控制台,可以看到flyway自动检测到了版本更新,并执行了添加脚本将数据添加到user表中
    GjB3ad.png

GjBbz6.png

mvn flyway:clean清除所有表

删除已配置数据库中的所有表。

GjsZPs.png

clean对与在开发和测试中有很大的帮助。这样当再执行migrate 迁移命令时会重新创建表,可以避免在测试中出现的一些脏数据影响代码逻辑。

  • 在线上环境中慎用

mvn flyway:info打印迁移信息

打印有关所有迁移的详细信息和状态信息。

GjyLhd.png

mvn flyway:validate校验

针对已解决的迁移(在文件系统或类路径上)验证已应用的迁移,以检测可能会导致无法准确创建架构的意外更改。

如果验证失败:

  • 发现迁移名称,类型或校验和方面的差异
  • 已应用不再在本地解析的版本
  • 已解决尚未应用的版本

GjcTFe.png

mvn flyway:undo撤销

撤消最近应用的版本迁移。

Gjg3Ox.png

mvn flyway:baseline基准

对现有数据库进行基准测试,如果不存在flyway_schema_history文件,则会直接创建,并以当前状态为版本1

Gj2uHf.png

mvn flyway:repair修复

修复Flyway模式历史记录表。这将执行以下操作:

  • 在没有DDL事务的数据库上删除所有失败的迁移
    (留下的用户对象仍必须手动清理)
  • 将可用迁移的校验和,描述和类型与可用迁移重新对齐

Gj2s29.png

参考 官网

作者: 只是学习学习
邮箱: fengzxia1000@163.com
原文地址: https://fengzxia.gitee.io/posts/cd84d80b.html
版权声明: 商业转载请联系作者获得授权,非商业转载请注明出处。