原因: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 的迁移校验和不匹配的主要内容,如果未能解决你的问题,请参考以下文章

类型 org.flywaydb.core.api.callback.FlywayCallback 不存在

预测试 SBT 任务:无法实例化 JDBC 驱动程序

SpringBoot 整合Flyway 常见问题科普解决

SpringBoot 整合Flyway 常见问题科普解决

普通原因与特殊原因的区别

普通原因与特殊原因的区别