天天看点

Flyway:数据库版本管理

数据库版本管理:管理并跟踪数据库的变更。

数据库版本管理工具:Flyway、Mybatis

说明:是独立于数据库的应用。

Migrate:Flyway工作流的核心功能,把数据库Schema迁移到最新版本。

Metadata:元数据,表,记录版本变更历史以及checksum。表名为flyway_schema_history,首次运行应用活执行对应的Flyway命令时,会自动创建该表,每执行完一个版本脚本都会新插入一条数据对应本次对数据库的更改。

Migrations:Flyway在更新数据库时使用的版本脚本。

说明:每次对数据库的更改,都应该新建一个脚本,而不能修改原有脚本,如直接修改原有脚本,在checksum的时候会失败。

在Spring Boot项目中,该脚本默认放再db.migration目录下。

Migrations不仅可以写成sql脚本,还可以写在java代码中。

脚本命名:Flyway是约定优于配置,所以有对应的命名规范。sql脚本的命名类似v1_init_tables.sql,也可以用当前时间作为v后面的版本号,如V10.0.0.20170522.1530_create_task_table.sql。

Flyway的工作原理

官方地址:https://flywaydb.org/documentation/getstarted/how

场景一:使用Flyway从无到有创建数据库

Flyway:数据库版本管理

Flyway用schema_version_history数据库存放数据库schema的历史记录,跟踪数据库结构的变更;

由于刚开始数据库为空,Flyway找不到schema_version_history数据表,就在数据库中创建了此表,之后我们需要在项目中定义Migration,通常用SQL或Java定义。

如下图,Flyway在运行时会顺序执行上图中的Migration1和Migration 2来实现对数据库的更新;同时’schema_version_history’表也会记录下这两次修改。

Flyway:数据库版本管理

'schema_version_history’表记录修改历史。如下图所示:

Flyway:数据库版本管理
脚本文件名(对应flyway_schema_history表的script字段)定义规则:
    常用格式如下:
    $PREFIX$VERSION__$REMARK.$SUBFIX
说明:
$prefix  表示 前缀,可在配置中指定,默认为 V;
$version 表示 版本号,版本号中也可以使用 . 或 _分隔,在解析时会将 _ 转换为 . 再保存到flyway_schema_history表的version字段中;
$remark  表示 备注,解析后会将这部分写入到描述字段中;
$subfix  表示 后缀,可在配置中指定,默认为 .sql ;
版本号与备注之前使用__分隔;
例如: V20200307_01__initial.sql
           

场景二:基于已有数据库更新

在此场景下,Flyway仍然会遍历项目中定义的各个Migration,并参照schema_version_history数据表,忽略版本号低于或等于当前版本的Migration,

剩下的就是Pending Migration(待处理迁移版本),然后按照版本号顺序执行Pending Migration,如下图所示:

Flyway:数据库版本管理

'schema_version_history’表记录修改历史。如下图所示:

Flyway:数据库版本管理

因此,每当我们要对数据库的DDL或者DML进行迁移时,就只需要定义一个更高版本的Migration。

Spring Boot项目整合Flyway

Flyway:数据库版本管理

1、在项目的pom文件中导入flyway依赖:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.3.0</version>
</dependency>
           

又如:

dependencies{
	compile 'org.flywaydb:flyway-core:6.1.0'
}
           

2、在application.properties或者application.yml文件添加配置

# 说明,在spring boot 1.x中,属性前缀为flyway,在spring boot 2.x中为spring.flyway,这里需要区分不同版本
Spring.flyway:
  # 到新的环境中数据库中有数据,且没有flyway_schema_history表时,是否执行迁移操作。
    如果设置为false,在启动时会报错,并停止迁移;
    如果设置为true,则生成history表并完成所有的迁移,要根据实际情况设置;
  baseline-on-migrate: false
  # 执行时标记的tag 默认为<<Flyway Baseline>>
  baseline-description: <<Flyway Baseline>>
  # 是否启用flyway
  enabled: true
  # 检测迁移脚本的路径是否存在,如不存在,则抛出异常
  check-location: true
  # 脚本位置
  locations: classpath:db/migration
  # 在迁移时,是否校验脚本,假设V1.0__初始.sql已经迁移过了,在下次启动时会校验该脚本是否有变更过,则抛出异常
  validate-on-migrate: true
特别说明:
   如果非空数据库迁移,在目标数据库中手动建flyway_schema_history表并手动写入初始化的脚本记录,
   使flyway跳过最初的校验即可,后续可以保证版本的统一;
           

3、创建迁移数据库脚本文件

4、验证,项目启动日志显示校验信息

Flyway:数据库版本管理

补充一:

新建一个spring boot项目,sql选择flyway migration,创建成功后,resources目录下出现db/migration目录,这个目录用来存放数据库脚本:

Flyway:数据库版本管理

补充二:application.properties配置文件信息属性

Flyway:数据库版本管理

参考链接:https://www.cnblogs.com/cndarren/category/1656455.html

继续阅读