Migration数据库sql管理工具

431 阅读3分钟

migration是什么

migration是一个对你的数据库进行版本控制,能够让你方便快捷的迁移数据的管理工具。其本质是在数据库初始化时建立schema_history元数据信息表,通过递增版本号对数据进行管理控制。

b500023d08e7dd6eacb2b7fa2a599bb.png 在java社区生态中,springboot已经默认集成了对migration的支持,也促进了本身的发展

所支持的数据库类型

官网以支持:Oracle,SQL Server,MySQL, MariaDB , PostgreSQL , SQLite , DB2 等主流数据库的支持 image.png

migration与spingboot的集成

引入

  • maven依赖引入(随项目启动执行):

在springboot按需引入依赖,对springboot工程,默认引用已经引入,这里不需要进行版本号的配置,仅需要按需引入flyway-core即可(我这里springboot版本号:2.5.3,所对flyway版本号:7.7.3)

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
  • 插件引入(通过运行插件命令运行):

在pom的plugin配置中增加如下配置

...

<plugins>

    ...
    
    <plugin>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-maven-plugin</artifactId>
        <configuration>
            <!-- 数据库链接中的&字符需要用转义符 &amp; 替代-->
            <url>jdbcUrl</url>
            <password>password</password>
            <user>user</user>
            <driver>org.postgresql.Driver</driver>
        </configuration>
    </plugin>
    
    ...
</plugins>
...

插件可执行命令:

image.png

【mvn flyway:baseline】 创建基准,数据库链接

【mvn flyway:migrate】 执行迁移命令

...

项目配置

  • 最简化配置
spring:
  # flyway 配置
  flyway:
    # 启用或禁用 flyway
    enabled: true
    # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这里干脆直接禁掉删除这类危险操作
    clean-disabled: true
  • 完全配置
spring:
  # flyway 配置
  flyway:
    # 启用或禁用 flyway
    enabled: true
    # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这里干脆直接禁掉删除这类危险操作
    clean-disabled: true
    # 编码格式,默认UTF-8
    encoding: UTF-8
    # 迁移sql脚本文件存放路径,默认db/migration
    locations: classpath:db/migration,classpath:db/migration-postgres
    # 迁移sql脚本文件名称的前缀,默认V
    sql-migration-prefix: V
    # 迁移sql脚本可重复执行文件名称的前缀,默认R
    repeatable-sql-migration-prefix: R
    # 迁移sql脚本文件名称的分隔符,默认2个下划线__
    sql-migration-separator: __
    # 迁移sql脚本文件名称的后缀
    sql-migration-suffixes: .sql
    # 迁移时是否进行校验,默认true
    validate-on-migrate: true
    # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    baseline-on-migrate: true
    baseline-version: 1
    

初始化脚本

初始化脚本默认配置路径在:db/migration文件下,调整路径通过locations配置更改,可配置多个路径

image.png

新增初始化脚本时,需要规范命名,默认版本号切分规则:

image.png

migration会去指定位置下寻找指定sql文件,并按照前缀和默认双下划线分隔符切分版本号,按照由小到大的版本号顺序依次执行sql

migration在首次初始化执行时,必须是空库,否则执行失败

sql脚本命名和结构如下:

image.png

运行项目,发现初始化脚本以成功执行,在元信息表中执行成功

image.png

不同模块的多个migration-sql引入

  • 不同模块如果同时含有不同migration的相关配置时,首先要保证sql文件的版本号不能相同

  • migration与其他模块集成(以actviti冲突为例)

在工作流组件activiti引入时,activiti会自动执行相关初始化

这个启动顺序如果activiti先执行了相关构建sql表操作,那migration则会报错(migration空库的要求),这个本质上产生这种问题是spring容器对于bean加载顺序影响导致的

image.png image.png

在源码中发现migration是通过:flywayInitializer,这个bean加载执行sql的,那对于activiti这类也需要执行sql的模块,只需要在activiti之前执行flyway即可,在相关配置类上添加 @DependsOn(value = {"flywayInitializer"})

image.png