1,功能
- 数据库版本管理;
实现管理并跟踪数据库变更,支持数据库版本自动升级。
2,使用
1)java使用
添加依赖
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>6.5.7</version>
</dependency>
配置:
java
spring:flyway:#是否启用enabled: true# 可以支持多个location, 用','隔开locations: classpath:db/migration#是否创建元数据表validate-on-migrate: true# flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是false 理论上作为默认配置是不科学的。V9版本中默认值为true。clean-disabled: true# 说明baseline-description: baseline init# 如果数据库不是空表,需要设置成 true,否则启动报错# 设置为true后flyway将在需要baseline的时候,自动执行一次baseline。baseline-on-migrate: true# 版本控制日志表,默认flyway_schema_history,不同系统建议修改数据table: flyway_history_table_${spring.application.name}
2)sql脚本命名规范
前缀+版本号(以.或者_分隔)+分隔符(双下划线__)+脚本名.sql
举例:V1.6.0__ADD_xxx.sql R__clean.sql(无版本号)
- 版本号递增;
- checkSum一致;
相同版本号对应的脚本,checkSum不同会抛出异常。
checkSum算法:CRC32 (循环冗余校验码)算法。 - 前缀:
V
开头表示仅执行一次;优先级高于R
执行;文件不可被删除、修改。
R
开头表示重复执行;多个R执行顺序按命名顺序来。
3)shell使用
命令格式:
flyway-6.0.3/flyway migrate -url=jdbc:postgresql://postgresql.host:5432/ngsoc -user=postgres -password=${DB_PASS} -schemas=public -table=flyway_history_table_${SERVER} -locations=filesystem:${BASE_DIR}/db -baselineVersion=0 -baselineOnMigrate=true
命令 | 说明 |
---|---|
Migrate | 把数据库默认数据库迁移到最新版本 |
Clean | 清除指定库下所有的对象,包括table、view、triggers…,让数据库变成空的状态。 |
Info | 打印所有Migrations的详细和状态信息 |
Validate | 验证已经应用的Migrations是否有变更,Flyway是默认是开启验证的。 |
Baseline | 针对已经存在表结构的数据库的一种解决方案,即实现在非空数据库中新建Metadata表,并把Migrations应用到该数据库。 |
Repair | 修复Metadata表,该操作在Metadata表出现错误时是非常有用的。 |
4)版本回退、任务队列、异步任务
商业版才有。
3, 原理
- 首次执行时创建flyway_schema_history的历史记录表
这张表用来跟踪或记录数据库的状态,然后每次项目启动时都会自动扫描在resources/db/migration下的文件的版本号并且通过查询flyway_schema_history来判断是否有新增文件,从而判断是否进行迁移。 - 数据库锁机制:数据库排他锁
用于控制分布式节点多节点执行sql脚本时可控。
4,对比
维度 | Flyway | Liquibase |
---|---|---|
可观测性 | 通过数据库schema历史表查看变更记录。 | 可以通过页面查看所有变更记录 |
跨平台 | 不支持跨平台 | 支持跨平台。 |