flyway启动报错FlywayValidateException:Validate failed:Migrations have failed validation

通过报错堆栈定位到代码

if (!context.ignored && MigrationState.IGNORED == state) {
    if (getVersion() != null) {
        String errorMessage = "Detected resolved migration not applied to database: " + getVersion() + ". To ignore this migration, set -ignoreIgnoredMigrations=true. To allow executing this migration, set -outOfOrder=true.";
        return new ErrorDetails(ErrorCode.RESOLVED_VERSIONED_MIGRATION_NOT_APPLIED, errorMessage);
    }
    String errorMessage = "Detected resolved repeatable migration not applied to database: " + getDescription() + ". To ignore this migration, set -ignoreIgnoredMigrations=true.";
    return new ErrorDetails(ErrorCode.RESOLVED_REPEATABLE_MIGRATION_NOT_APPLIED, errorMessage);
}

主要是因为state = MigrationState.IGNORED导致的
往上找state来源,逻辑如下
1.flyway扫描本次启动有哪些脚本存为列表1
2.flyway自己表flyway_schema_history的记录存为列表2
3.遍历列表1,如果列表1的version在2中出现type为DELETE的记录,则将该version标记为DELETE
4.获取脚本state,如果脚本被标记为DELETE,state置为IGNORED

结论:因为表flyway_schema_history中存在version不为空且type为DELETE且不是最大版本号的记录
猜测DELETE记录是出现了用较老版本启动导致(实际验证发现只有可重复脚本会出现DELETE记录,不能确定到底是发生了什么导致带version的脚本会出现DELETE记录)
如:master分支包含脚本 23.1 24.1 25.1 ,启动后表中存了三条记录,且最大版本号更新为25.1
后有人用a分支启动,a分支较老只有23.1 的脚本,启动后flyway发现24.1和25.1在本次启动被删除了,新增两条DELETE的记录
然后用master分支启动时,又将24.1 25.1带上,此时因为最大版本号是25.1,所以24.1和25.1都是不会执行的,但是存在DELETE的记录说明这两个脚本被删了这次又带上,flyway认为这两个脚本又被加回来了,但是他不会执行这两个脚本,所以给出提示让用户自己解决,正如提示中说可以加参数忽略错误

解决方案:如果确认是意外且24.1和25.1已经被正常执行过,那么可以删除flyway_schema_history中的为delete的记录,这样启动就不会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值