原因:org.flywaydb.core.api.FlywayException:验证失败。迁移 2 的迁移校验和不匹配
Posted
技术标签:
【中文标题】原因:org.flywaydb.core.api.FlywayException:验证失败。迁移 2 的迁移校验和不匹配【英文标题】:Caused by: org.flywaydb.core.api.FlywayException: Validate failed. Migration Checksum mismatch for migration 2 【发布时间】:2017-04-30 02:07:05 【问题描述】:我试图找到以下问题的解决方案,但没有一个对我有用。我正在使用 MySQL + flyway 开发 Angular + Spring Boot 应用程序。请指导这里出了什么问题。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed. Migration Checksum mismatch for migration 2
-> Applied to database : 1499248173
-> Resolved locally : -1729781252
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:764) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:357) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:305) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1124) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1113) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at com.boot.App.main(App.java:9) [classes/:na]
Caused by: org.flywaydb.core.api.FlywayException: Validate failed. Migration Checksum mismatch for migration 2
-> Applied to database : 1499248173
-> Resolved locally : -1729781252
at org.flywaydb.core.Flyway.doValidate(Flyway.java:1108) ~[flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway.access$300(Flyway.java:62) ~[flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:1012) ~[flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway.execute(Flyway.java:1418) ~[flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway.migrate(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na]
at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
... 18 common frames omitted
application.properties
logging.level.org.springframework.web=DEBUG
server.port=8080
spring.h2.console.enabled=true
spring.h2.console.path=/h2
## For H2 DB
#spring.datasource.url=jdbc:h2:file:~/dasboot
#spring.datasource.username=sa
#spring.datasource.password=
#spring.datasource.driver-class-name=org.h2.Driver
## For mysql DB
spring.datasource.url=jdbc:mysql://localhost:3306/dasboot
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=10
spring.datasource.max-idle=8
spring.datasource.max-wait=10000
spring.datasource.min-evictable-idle-time-millis=1000
spring.datasource.min-idle=8
spring.datasource.time-between-eviction-runs-millis=1
flyway.baseline-on-migrate=true
spring.jpa.hibernate.ddl-auto=false;
#datasource.flyway.url=jdbc:h2:file:~/dasboot
#datasource.flyway.username=sa
#datasource.flyway.password=
#datasource.flyway.driver-class-name=org.h2.Driver
datasource.flyway.url=jdbc:mysql://localhost:3306/dasboot
datasource.flyway.username=root
datasource.flyway.password=root
datasource.flyway.driver-class-name=com.mysql.jdbc.Driver
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
</parent>
<name>das-boot</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
V2__create_shipwreck.sql
-- For H2 DB
--CREATE TABLE SHIPWRECK(
-- ID INT AUTO_INCREMENT,
-- NAME VARCHAR(255),
-- DESCRIPTION VARCHAR(2000),
-- CONDITION VARCHAR(255),
-- DEPTH INT,
-- LATITUDE DOUBLE,
-- LONGITUDE DOUBLE,
-- YEAR_DISCOVERED INT
--);
CREATE TABLE `dasboot`.`shipwreck` (
`ID` INT NOT NULL AUTO_INCREMENT,
`NAME` VARCHAR(255) NULL,
`DESCRIPTION` VARCHAR(2000) NULL,
`CONDITION` VARCHAR(255) NULL,
`DEPTH` INT NULL,
`LATITUDE` DOUBLE NULL,
`LONGITUDE` DOUBLE NULL,
`YEAR_DISCOVERED` INT NULL,
PRIMARY KEY (`ID`));
【问题讨论】:
Flyway on production database - Migration Checksum mismatch的可能重复mvn flyway:repair
解决了我的问题。似乎即使您没有成功迁移,您也需要将其删除。感谢***.com/questions/41147768/…
【参考方案1】:
Flyway 正在将 SQL 脚本的校验和与之前运行的校验和进行比较。如果您更改了 Flyway 已应用的 SQL 脚本,通常会发生此异常,从而导致校验和不匹配。
如果这是开发,您可以删除数据库并从头开始迁移。
如果您在生产中,切勿编辑已应用的 SQL 脚本。以后只创建新的 SQL 脚本。
【讨论】:
我只是将数据库从 H2 DB 迁移到 MYSQL。然后我简单地更新了 V2__create_shipwreck.sql。请指导我如何解决它。我在上面的帖子中编辑了 V2__create_shipwreck.sql。即使是沉船表也没有在 MYSQL 中创建。 删除数据库并重新运行 Flyway,它将从头开始重建。 删除数据库?如果你有很多测试数据?下降不是解决方案。它有效,但不是解决问题的方法。 @Djalas 正如我的回答所示,更改应始终添加到新的 SQL 脚本,而不是现有的 SQL 脚本。 我明白你的意思。但是,如果您在校验和错误之前已经运行了一堆集成测试。删除数据库将清除您的数据库以及可能有用的测试数据。应用迁移不会给你测试数据,集成测试会给你。我过去已经放弃了我的时间,但只是在我不关心我存储在本地 postgres 实例中的数据时。【参考方案2】:如果您不在生产中,您可以在数据库中查看您的flywayTable
,并删除包含已应用脚本名称的行。
flywayTable
是一个项目选项,它定义了flyway使用的数据库中的表名,其中包含有关此数据库版本、已应用脚本的信息...
【讨论】:
这是我的朋友!关于开发环境中此错误的最佳解决方案。谢谢【参考方案3】:最好的解决方案是执行以下步骤:
-
删除名为 - V2__create_shipwreck.sql 的文件,清理并
再次构建项目。
再次运行项目,登录 h2 并 删除名为“schema_version”的表。
删除表 schema_version;
现在用 ddl 制作 V2__create_shipwreck.sql 文件并重新运行项目。
记住这一点,在 pom.xml 中为 flyway-core 添加 4.1.2 版本,如
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.1.2</version>
</dependency>
它现在应该可以工作了。希望这会有所帮助。
【讨论】:
我无法删除 schema_version。我该怎么办? 您可以只删除您遇到问题的行,例如:delete from schema_version where version = 2; 改用这个:drop table "schema_version"; 这个固定我的,但是,我需要使用:drop table "flyway_schema_version";【参考方案4】:我会简单地从 schema_version 中删除偏离要应用的迁移的迁移。这样您就不会丢弃您可能拥有的任何测试数据。
例如:
SELECT * from schema_version order by installed_on desc
V_005_five.sql
V_004_four.sql
V_003_three.sql
V_002_two.sql
V_001_one.sql
要应用的迁移
V_005_five.sql
* V_004_addUserTable.sql *
V_003_three.sql
V_002_two.sql
V_001_one.sql
这里的解决方案是从 schema_version 中删除
V_005_five.sql
V_004_four.sql
并恢复引起的任何数据库更改。例如,如果架构创建了新表,那么您必须在运行迁移之前删除该表。
当你运行 flyway 时,它只会重新申请
V_005_five.sql
* V_004_addUserTable.sql *
新的 schema_version 将是
V_005_five.sql
* V_004_addUserTable.sql *
V_003_three.sql
V_002_two.sql
V_001_one.sql
希望对你有帮助
【讨论】:
@user5707585 这应该是公认的答案,因为它实际上有助于为您的问题提供解决方案,而不是居高临下地向总法律顾问提出您一开始不应该做的事情。【参考方案5】:更新您的 schema_version 记录以匹配“本地解析”值,在您的情况下为 -1729781252
【讨论】:
【参考方案6】:实际上还有另一种解决方案,但它是一种变通方法,不应该在管理得当的项目中完成。但是我遇到了一种情况,不可能走更好的路:)
您可以更新 schame_version 表,并将校验和实际更改为新的。这将导致迁移通过,但可能会产生其他副作用。
当部署到不同的环境(test、uat、prod 等)时,可能会发生,您必须在更多环境中更新相同的校验和。而当涉及到 gitflow 和 release 分支时,你可以很容易地混淆整体。
【讨论】:
【参考方案7】:我遇到了同样的问题并从数据库中删除了完整的架构,但问题仍然存在。
我通过运行flyway的repair()
命令解决了这个问题:
flyway.repair();
或者使用 Flyway Maven 插件:
mvn flyway:repair
在 pom.xml 中添加 Maven 插件:
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
</plugin>
顺便说一句:我没有发现到底出了什么问题。
使用 Gradle(根据 Raf 的评论):
./gradlew flywayRepair
【讨论】:
这个脚本是在哪里写的? 那是在初始化 Flyway 之后,例如Flyway flyway = new Flyway(); flyway.setDataSource(数据源); flyway.repair(); flyway.migrate(); 如果你使用的是 gradle,那么./gradlew flywayRepair
就可以了
谢谢,这个答案应该在最上面。【参考方案8】:
Flyway 将其计算校验和的方式从版本 3 更改为版本 5。您可以重新计算校验和。由于 Flyway 插件无法正确读取 Spring 数据源属性,因此您必须在命令行上手动指定它们 (or one of the other various ways Flyway accepts)。
mvn flyway:repair -Dflyway.user=root -Dflyway.password= -Dflyway.url=jdbc:mysql://localhost:3306/mydatabase -Dflyway.table=schema_version
Flyway 还更改了它存储校验和的表,因此您还必须指定 flyway-table=schema_version
才能使用旧表,否则它会给您一个警告(并且可能在版本 6 中出现错误)。
[INFO] Repairing Schema History table for version 2 (Description: create sources, Type: SQL, Checksum: 2125962141) ...
[INFO] Repairing Schema History table for version 3 (Description: create stats, Type: SQL, Checksum: 389912194) ...
[INFO] Repairing Schema History table for version 4 (Description: add user encrypted, Type: SQL, Checksum: 182607572) ...
【讨论】:
【参考方案9】:如果您确定 SQL 文件中的修改对您现有的架构没有影响,您还可以更新现有架构的校验和。
我是在对 sql 文件稍作更改后执行此操作的。
这是我更新校验和的方法:
update flyway_schema_history set checksum = '-1934991199' where installed_rank = '1';
【讨论】:
【参考方案10】:简单的解决方案是将 application.properties 中的 spring.datasource.url=jdbc:h2:file:~/dasboot 更改为新文件名,例如:spring.datasource.url=jdbc:h2:file:~/ dasboots
【讨论】:
【参考方案11】:1-删除迁移文件。 2-连接到您的数据库并删除迁移创建的表。 3-使用正确的 sql 重新创建迁移文件。
【讨论】:
【参考方案12】:我遇到了同样的问题,我相信这是因为 linux 和 windows(还有 mac)之间的校验和造成的。
你可以在flyway中use repair()
命令。
flyway.repair();
注意,如果你是在生产环境,请确保你没有更改迁移 SQL 文件;因为当您运行 flyway.repair();
时,这意味着您对 flyway 说您确定迁移版本及其校验和,然后 flyway 修复它们!
【讨论】:
【参考方案13】:当我在本地系统中遇到此问题时,这是对我有用的解决方案。
-
转到数据库中的 flyway_schema_history
删除包含 sql 迁移脚本的行
【讨论】:
在我的例子中,表的名称是 schema_version。【参考方案14】:如果您在生产中遇到问题,您的 V2__create_shipwreck.sql 必须与未修改的最新版本中的相同。
那么校验和就会再次正确
【讨论】:
【参考方案15】:只需添加
spring.flyway.enabled=false
如果您不希望 flyway 在每次运行应用程序时检查校验和,请在 application.properties 文件中。
【讨论】:
【参考方案16】:在您的本地数据库中使用此查询。
从 schema_version 中选择 * 从 schema_version 中删除 校验和列 = -1729781252;
注意:-1729781252 是“本地解析”值。
构建并启动服务器。
【讨论】:
【参考方案17】:当我遇到这个问题时,我所做的是连接到数据库并更新与错误版本对应的校验和字段,将 FlyWay 本地解析的值放在那里。
对于以下错误:
nested exception is org.flywaydb.core.api.FlywayException: Validate failed.
Migration Checksum mismatch for migration 1.12
-> Applied to database : 1029320280
-> Resolved locally : -236187247
我只是这样做了:
UPDATE schema_version SET checksum = -236187247 WHERE version_rank = 12 AND checksum = 1029320280;
问题解决了..
注意:您必须确保您的架构实际上是正确的,检查您的表及其结构,如果一切正常,那么您可以应用此解决方案;否则,您应该首先使用普通的原生 SQL 手动修复架构。
【讨论】:
【参考方案18】:我遇到了同样的问题并尝试了所有选项(删除架构、删除特定行、更新校验和),但没有任何效果。
在我的例子中,flyway-core 依赖以某种方式被破坏了。
解决方案:
从 ~.m2\local 存储库路径...\org\flywaydb\flyway-core 中删除 flyway-core 文件夹。
执行“maven clean install”,它会下载新的并将其添加到项目中。
我希望这会有所帮助。
【讨论】:
【参考方案19】:在开发过程中有 3 种方法可以解决此问题。下面的任何人都可以解决这个问题。 1) 在新的迁移 sql 文件中提供具有递增版本的更改 2) 更改我们提供的 db url 中的架构名称 datasource.flyway.url=jdbc:h2:file:~/cart3 datasource.flyway.url=jdbc:h2:file:~/cart4 3) 删除用户主目录中的 .mv 和 .trace 文件 例如:c://users/username/ 下的 cart3.mv 和 cart3.trace
【讨论】:
【参考方案20】:只是不验证:
flyway.setValidateOnMigrate(false);
【讨论】:
这不是一个好习惯。因为如果已应用迁移,则对该迁移的任何更改都不会反映到数据库中,如果您跳过验证,您甚至不会收到错误。 是的,但是如果您升级了flyway版本并发现它会导致错误,这会有所帮助。以上是关于原因:org.flywaydb.core.api.FlywayException:验证失败。迁移 2 的迁移校验和不匹配的主要内容,如果未能解决你的问题,请参考以下文章