目录

flyway中sql脚本修改导致的错误

简介

flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令(Flyway java基本知识:https://blog.csdn.net/tanghin/article/details/51264795)。

使用该工具,配置好数据库脚本,在项目运行的时候即可将数据库脚本执行到数据库中,同时会在数据库表schema_version中增加相应的记录(若第一次执行,则会创建该表)。

报错1

./1.jpg

分析1

那么这段话表示什么意思呢? 看这句话:

1
2
3
Caused by:ori.flywaydb.core.api.FlywayException:Validate failed:migration checksum mismatch for migration 1.15.0
->Applied to database: 37561532
->Resolved locally  : -351684334

Flyway中的checksum值应当是-351684334,但是实际上运行的值是37561532,而且这个错误是在运行SQL Script 1.15.0出现的!

那么出现这个问题的原因是什么呢? 这里涉及到flyway的一些基本常识,flyway 官方文档 常识1):项目每次执行,都会调用数据库,会先运行SQL Script 要使用到Flyway,但是flyway查询数据时,会判断数据库的数据结构或者数据什么的是否改变,判断标准就是checksum。

./2.jpg

如图所示:在1.15被执行之前,执行的版本是1.14,也是初始化,但是在项目中的SQLScript更新到1.15版本后,项目开始运行的话,会先执行1.15,如果1.15没有执行即第二行没有增加的话,那么,会执行1.15版本,然后会有个checksum,如果检测到有1.15版本的话,那么将会检测自己的checksum后数据库里面的checksum是否相等,如果相等,那么就不会报错,但是,如果不相等的话,就会报出上面的异常;如果没有1.15版本的话,就会成功进行数据操作,最后生成1.15的记录。

常识2)Github管理项目,由于项目开发不是一个人,运行项目的版本可能不相同,但是数据库只有一个,每个项目运行都会用到flyway,进行数据操作。

总结:Github下,运行的版本不一样,有的使用的Sql Script 版本是1.14,但是有的是1.15,如果版本不进行及时更新的话,就会出现错误。

解决1

如何解决这个问题: 将上面数据表格中的对应的数据元删掉,然后运行最新的版本。

报错2

今天重新导入了项目,在运行项目的时候报错:

1
org.springframework.beans.factory.BeanCreationException: Errorcreating bean with name 'flyway' defined in URL[file:/E:/gerp/war/target/gerp/WEB-INF/classes/spring/spring-jdbc.xml]:Invocation of init method failed; nested exception isorg.flywaydb.core.api.FlywayException: Validate failed: Detected appliedmigration not resolved locally: 18.616

之类的。

解决2

通过查找资料发现,Flyway执行脚本的时候会检查脚本是否有改动,并对其进行校验。若改动,则会校验错误,报错。

后尝试把数据库表中的schema_version删除,但虽然能够执行脚本,但若存在一些不能重复操作的sql(如:建表语句),依然会报错。

最终需要把schema_version与其相对应才能正常使用