Flyway Validate failed:migration checksum mismatch for migration 1.0.0003

今天在server端跑flyway的时候遇到这个问题,简单的总结一下:

首先看一下Flyway的官网介绍https://flywaydb.org/getstarted/how


在使用flyway的时候,简单的流程: 

新建一个数据库

Flyway Validate failed:migration checksum mismatch for migration 1.0.0003_第1张图片


当配置好flyway的基本信息后,运行flyway,会在数据库表中默认新建一个数据表,用于存储flyway的运行信息,默认的数据库名:SCHEMA_VERSION


Flyway Validate failed:migration checksum mismatch for migration 1.0.0003_第2张图片此表将用于跟踪数据库的状态。


紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁移。 它们可以用Sql或Java编写。

然后,Flyway的数据迁移将基于对用sql脚本的版本号进行排序,并按顺序应用:

Flyway Validate failed:migration checksum mismatch for migration 1.0.0003_第3张图片

当每个数据表执行之后,其对应的执行信息也会在SCHEMA_VERSION中进行更新


可以看到执行数据库表后在checksum中储存一个数值,用于在之后运行过程中对比sql文件执行是否有变化。


当再次执行Flyway的时候,Flyway将再次扫描文件系统或应用程序的类路径以进行迁移。 将根据元数据表检查迁移。 如果其版本号低于或等于标记为当前版本的版本号,则会被忽略。


其他的的迁移是待处理的迁移:可以使用,单数不会再数据库中执行脚本。

之后脚本重新按照版本号进行排序,并按照顺序执行脚本文件Flyway Validate failed:migration checksum mismatch for migration 1.0.0003_第4张图片

这时候SCHEMA_VERSION中的记录也会被更新


现在回到遇到的问题

Flyway   Validate failed:migration checksum mismatch for migration 1.0.0003

->Applied to database: 37561532->Resolved locally : -351684334


在执行第三个脚本文件的时候遇到问题,原有的checksum值和本次执行的checksum值对应不上

说明在这次运行的脚本中对版本号为1.0.0003的脚本文件有了修改,与原来执行的chencksum对应不上,此时Flyway会报错,

停止执行后续的脚本。


具体的解决方案:

方案一:

查看官网提供的命令:Flyway Repair命令

用于修复元数据表SCHEMA_VERSION

Flyway Validate failed:migration checksum mismatch for migration 1.0.0003_第5张图片

Repair是修复元数据表问题的工具。 它有两个主要用途:

删除失败的迁移条目(仅适用于不支持DDL事务的数据库)
将应用的迁移的校验和重新对齐到可用迁移的校验和


所以在执行flyway migrate之前,先执行 flyway repair,之后执行新的flyway脚本,会忽略原有的checksum值



方案二:

手动进入数据库,把出错的那行包括改行之后的所有数据删除,在执行flyway脚本的时候,他会发现在元数据表中没有执行过之前脚本的记录,所以会从该脚本开始运行,运行时也是按照版本号。但是不要再运行环境中使用这种方案,操作的时候也要注意相关数据的备份




注意:

flyway在执行脚本时,会在源数据表中检查checksum值,并确定上次运行运行到哪一个脚本文件,本次执行时从下一条脚本文件开始执行。

所以需要注意下:

编写脚本的时候不要去修改原有的脚本内容

新的脚本版本号要连续

注意如果在server上执行flyway,确保本地的脚本代码运行成功,之后再通过版本管理工具传递到server上









你可能感兴趣的:(database)