Flyway学习
- Flyway:数据库变更版本控制的工具。(类似于Git?只是Flyway不管理代码而管理数据库)
- Flyway可以自动执行SQL
- 当 Flyway 连接数据库中的 schema 后,会先检查是否已存在 flyway_schema_history 表,如果没有则创建
- 当 flyway_schema_history 存在后,Flyway 会扫描文件系统或应用中的 classpath 目录的数据迁移文件,然后根据它们的版本号进行按序迁移
- 由于 flyway_schema_history 表中记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行
- Flyway对数据库的所有更改都称为迁移
- Flyway使用CRC32(循环冗余校验码)算法来计算Checksum值。CRC32是一种广泛使用的校验算法,它可以将任意长度的数据块转换为32位的校验和值。CRC32算法通过对数据块进行一系列位运算和异或操作,生成一个固定长度的校验和
- 在Flyway中,Checksum的作用是用于检测迁移脚本是否被修改过。当执行迁移时,Flyway会计算迁移脚本中SQL语句的Checksum,并与元数据表中存储的Checksum进行比对。如果两者不一致,即表示迁移脚本已被修改过,Flyway会抛出错误,阻止继续执行该脚本。这样可以确保迁移脚本的内容完整性,并提供了一种简单的方法来检测脚本是否被意外修改。
注意事项:
- SQL文件名称格式:V__ .sql,两个下划线(可配置),案例V1__Create_person_table.sql
- 如果扫描到文件系统的中V开头文件发生变动,则Flyway运行会报错
- R开头文件可以重复执行
- 执行SQL文件名只能以下划线连接,不能使用中横线
- DDL与DML不能放置于同一版本的SQL文件中
一些命令:
flyway.baseline();
flyway.repair();
flyway.validate();
flyway.migrate();
flyway.clean();
一些配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:
username: flyway
password: xxx
flyway:
# 是否启用flyway
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀,默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baseline-on-migrate: true