migration是什么
migration是一个对你的数据库进行版本控制,能够让你方便快捷的迁移数据的管理工具。其本质是在数据库初始化时建立schema_history元数据信息表,通过递增版本号对数据进行管理控制。
在java社区生态中,springboot已经默认集成了对migration的支持,也促进了本身的发展
所支持的数据库类型
官网以支持:Oracle,SQL Server,MySQL, MariaDB , PostgreSQL , SQLite , DB2
等主流数据库的支持
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>
<!-- 数据库链接中的&字符需要用转义符 & 替代-->
<url>jdbcUrl</url>
<password>password</password>
<user>user</user>
<driver>org.postgresql.Driver</driver>
</configuration>
</plugin>
...
</plugins>
...
插件可执行命令:
【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配置更改,可配置多个路径
新增初始化脚本时,需要规范命名,默认版本号切分规则:
migration会去指定位置下寻找指定sql文件,并按照前缀和默认双下划线分隔符切分版本号,按照由小到大的版本号顺序依次执行sql
migration在首次初始化执行时,必须是空库,否则执行失败
sql脚本命名和结构如下:
运行项目,发现初始化脚本以成功执行,在元信息表中执行成功
不同模块的多个migration-sql引入
-
不同模块如果同时含有不同migration的相关配置时,首先要保证sql文件的版本号不能相同
-
migration与其他模块集成(以actviti冲突为例)
在工作流组件activiti引入时,activiti会自动执行相关初始化
这个启动顺序如果activiti先执行了相关构建sql表操作,那migration则会报错(migration空库的要求),这个本质上产生这种问题是spring容器对于bean加载顺序影响导致的
在源码中发现migration是通过:flywayInitializer,这个bean加载执行sql的,那对于activiti这类也需要执行sql的模块,只需要在activiti之前执行flyway即可,在相关配置类上添加
@DependsOn(value = {"flywayInitializer"})