Flyway 数据库版本控制

Flyway 简介

Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。
它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。

概念

版本:对数据库的每一次变更可称为一个版本。
迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移。
可用的迁移:Flyway的文件系统识别出来的迁移版本。
已经应用的迁移:Flyway已经对数据库执行过的迁移。

Flyway 基本命令

命令 描述
Baseline 初始化schema_version表,并插入一条原始verion=1
Info 打印所有的迁移的信息以及状态
Validate 迁移之前进行验证
Migrate 应用所有的迁移到最新版本,它会在你的DB中新建个表schema_version来存放每次升级的版本信息
Repair 它主要做了两件事,移除所有失败的迁移(升级),重置校验和删除schema_version失败记录
Clean 清除目标库所有表及数据,不可用!!!
Undo 用于撤销具有相同版本的版本化迁移带来的影响。但是该回滚过于粗暴,过于机械化,一般不推荐使用。一般建议使用 Versioned 模式来解决

Flyway 数据库版本控制_第1张图片

位置 描述
Prefix 可配置,前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable, U 表示 Undo
Version 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点 . 或下划线 _
Separator 可配置, 用于分隔版本标识与描述信息, 默认为两个下划线 __
Description 描述信息, 文字之间可以用下划线 _ 或空格 分隔
Suffix 可配置, 后续标识, 默认为 .sql
Flyway 将 SQL 文件分为 Versioned 、Repeatable 和 Undo 三种:
Versioned:用于版本升级, 每个版本有唯一的版本号并只能执行一次.
Repeatable:可重复执行, 当 Flyway检测到 Repeatable 类型的 SQL 脚本的 checksum 有变动, Flyway 就会重新应用该脚本. 它并不用于版本更新, 这类的 migration 总是在 Versioned 执行之后才被执行。
Undo:用于撤销具有相同版本的版本化迁移带来的影响。但是该回滚过于粗暴,过于机械化,一般不推荐使用。一般建议使用 Versioned 模式来解决

Spring Boot使用Flyway参数配置

# 数据库版本控制
spring:
  flyway:
    # 启用或禁用 flyway
    enabled: true
    # 字符编码
    encoding: utf-8
    # 对执行迁移时基准版本的描述
    baseline-description: test
    # 若连接的数据库非空库,是否初始化
    # 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    baseline-on-migrate: false
    # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略
    # 开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
    baseline-version: 1
    # 是否开启校验
    # 迁移时是否校验,默认为 true
    validate-on-migrate: true
    # 默认脚本加载路径:/db/migration
    # locations: ["classpath:/db/migration"]
    # flyway 的 clean 命令会删除指定 schema 下的所有 table,默认 false
    clean-disabled: false
    # 发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder
    # 是否允许无序的迁移,默认 false
    out-of-order: true
    # 检查迁移脚本的位置是否存在,默认false
    check-location: false
    # 当读取元数据表时是否忽略错误的迁移,默认false
    ignore-future-migrations: false
    # 当初始化好连接时要执行的SQL
    init-sqls: show tables;
    # 迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
    #url:
    # 迁移数据库的用户名
    #user:
    # 目标数据库的密码
    #password:
    # 设置每个placeholder的前缀,默认${
    #placeholder-prefix:
    # 是否要被替换,默认true
    #placeholder-replacement:
    # 设置每个placeholder的后缀,默认}
    #placeholder-suffix:
    # 设置placeholder的value
    #placeholders.[placeholder name]
    # 设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema
    #schemas
    # 迁移文件的前缀,默认为V
    #sql-migration-prefix:
    # 迁移脚本的文件名分隔符,默认__
    #sql-migration-separator:
    # 迁移脚本的后缀,默认为.sql
    #sql-migration-suffix:
    # 使用的元数据表名,默认为schema_version
    #tableflyway:
    # 迁移时使用的目标版本,默认为latest version
    #target:

项目引入 Flyway


    org.flywaydb
    flyway-core
    6.0.0-beta2

meven Flyway 插件

        
            
                org.flywaydb
                flyway-maven-plugin
                6.0.0-beta2
                
                
                    jdbc:mysql://192.168.1.48:3306/flyway?useLegacyDatetimeCode=false&useSSL=false
                    root
                    2%YcIZXyFH7LsC_y
                
            
        
        

使用Flyway注意点

  1. 生产务必禁 spring.flyway.cleanDisabled=false 。

  2. 尽量避免使用 Undo 模式。

  3. 开发版本号尽量根据团队来进行多层次的命名避免混乱。比如 V1.0.1__ProjectName_{Feature|fix}_Developer_Description.sql ,这种命名同时也可以获取更多脚本的开发者和相关功能的信息。

  4. spring.flyway.outOfOrder 取值 生产上使用 false,开发中使用 true。

  5. 多个系统公用一个 数据库 schema 时配置spring.flyway.table 为不同的系统设置不同的 metadata 表名而不使用缺省值 flyway_schema_history 。

建议使用版本:5.2.4

你可能感兴趣的:(Flyway 数据库版本控制)