flyway提供的功能:数据库版本管理

Flyway是⼀款开源的数据库版本管理⼯具,它更倾向于规约优于配置的⽅式。 Flyway可以独⽴于应⽤实现管理并跟踪数据库变更,⽀持数据库版本⾃动升级,并且有⼀套默认的规约,不需要复杂的配置,Migrations 可以写成SQL脚本,也可以写在Java代码中,不仅⽀持Command Line和Java API,还⽀持Build构建⼯具和Spring Boot等,同时在分布 式环境下能够安全可靠地升级数据库,同时也⽀持失败恢复等。 通俗的讲,Flyway可以像Git管理不同的⼈的代码那样,管理不同⼈的sql脚本,坐到数据库同步的功能。

脚本命名规范

在创建Flyway的SQL脚本时,有些命名规范需要遵守,这些命名规范决定了Flyway执行脚本的顺序和方式,可以先参考下面的示意图。

示例

V1.0.0__init_table.sql

为了能被Flyway正确执行,SQL迁移脚本需要遵循如下规范:

  • <V> Prefix(前缀):V表示有版本号的数据库迁移,U表示一些数据库版本的回滚,R表示可重复执行的数据库迁移;
  • <1.0.0> Version(版本号):Flyway会按照版本号的大小顺序来执行数据库迁移脚本;
  • <__> Separator(分隔符):命名时使用双下划线分隔符;
  • <init_table> Description(描述):用于描述该迁移脚本的具体操作说明;
  • <.sql> Suffix(后缀):表示.sql文件。

SpringBoot集成

  • 首先在pom.xml中添加Flyway相关依赖,注意无需添加Flyway的版本号:
<!--Flyway相关依赖-->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
  • 修改配置文件application.yml,对数据源和Flyway进行配置;
spring:
  flyway:
    # 启用Flyway功能
    enabled: true
    # 禁用Flyway的clean命令,使用clean命令会删除schema下的所有表
    clean-disabled: true
    # 设置Flyway的SQL脚本路径
    locations: classpath:db/migration
    # 设置版本信息控制表名称,默认flyway_schema_history
    table: flyway_schema_history
    # 在执行migrate命令时需要有flyway_schema_history表,通过baseline命令可以生成该表
    baseline-on-migrate: true
    # 指定baseline版本号,低于该版本的SQL脚本在migrate是不会执行
    baseline-version: 1
    # 设置字符编码
    encoding: UTF-8
    # 不允许不按顺序迁移
    out-of-order: false
    # 设置Flyway管控的schema,不设置的话为datasourcel.url中指定的schema
    schemas: flyway
    # 执行migrate时开启校验
    validate-on-migrate: true

注意事项

1、不支持降级,支持事务回滚,千万不要手动更改数据库表结构!!!更新前,做好备份!
2、在resources资源文件夹下的sql路径要与配置路径保持一致,如上面配置文件夹db/migration/sqlserver
3、不要使用@PostConstruct注解做数据查询处理,因为启动微服务时会先启动PostConstruct里的方法,后启动flyway,可能造成方法无法读取还没有创建的数据库表; 如果要使用,则使用注解@DependsOn(“flywayInitializer”)
4、V8.2.5_20220721_1000__init.sql第三个是两个下划线,请注意!
5、使用R可以重新执行已经修改过的sql文件,如:R__V8.2.5_20220721_1000__init.sql

示例:xm-demo-flyway