Flyway学习使用

327 阅读2分钟

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_schema_history 表

		flyway.baseline();

		// 删除 flyway_schema_history 表中失败的记录

		flyway.repair();

		// 检查 sql 文件

		flyway.validate();
		

		// 执行数据迁移

		flyway.migrate();

		
		// 删除当前 schema 下所有表

		flyway.clean();

一些配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xukj_flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    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