引起:org.flywaydb.core.api.FlywayException:验证失败。迁移校验和不匹配迁移2

时间:2016-12-14 16:41:36

标签: java spring-boot flyway

我试图找到以下问题的解决方案,但它们都没有为我工作。我正在使用 MySQL + flyway 开发 Angular + Spring Boot 应用程序。请指导这里出了什么问题。

type A struct {
   X string
   Y int
   *A
}

application.properties

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

的pom.xml

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

V2__create_shipwreck.sql

<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>

enter image description here

20 个答案:

答案 0 :(得分:43)

Flyway正在将SQL脚本的校验和与先前运行的校验和的校验和进行比较。如果更改已由Flyway应用的SQL脚本,则通常会发生此异常,从而导致校验和不匹配。

如果这是开发,您可以删除数据库并从头开始迁移。

如果您正在制作中,请不要编辑已应用的SQL脚本。只创建新的SQL脚本。

答案 1 :(得分:12)

最好的解决方案是执行以下步骤:

  1. 删除名为 - V2__create_shipwreck.sql的文件,清理并执行 再次构建项目。
  2. 再次运行项目,登录h2和 删除名为“schema_version”的表。

      

    drop table schema_version;

  3. 现在用ddl创建V2__create_shipwreck.sql文件,然后重新运行该项目。

  4. 请记住这一点,在pom.xml中为flyway-core添加版本4.1.2,如

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>4.1.2</version>
    </dependency>
    
  5. 现在应该可以了。希望这会有所帮助。

答案 2 :(得分:7)

我只是从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

AND还原导致的任何数据库更改。例如,如果架构创建了新表,则必须在运行迁移之前删除该表。

当您运行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

希望有所帮助

答案 3 :(得分:7)

我遇到了同样的问题并从数据库中删除了完整的架构,但问题仍然存在。

我通过运行flyway的repair()命令解决了这个问题:

flyway.repair();

或者使用Flyway Maven插件:

mvn flyway:repair

将maven插件添加到pom.xml中:

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>5.2.4</version>
</plugin>
顺便说一句:我没找到到底出了什么问题。

答案 4 :(得分:3)

在本地数据库中使用此查询。

  1. 从schema_version选择* 从schema_version删除,其中 checksum列 = -1729781252;

    注意:-1729781252是“本地解析”值。

  2. 构建并启动服务器。

答案 5 :(得分:3)

当我在本地系统中遇到此问题时,这是对我有用的解决方案。

  1. 转到数据库中的flyway_schema_history
  2. 删除包含sql迁移脚本的行

答案 6 :(得分:1)

如果您不在生产中,您可以查看数据库中的flywayTable并删除包含已应用脚本名称的行。

flywayTable是一个项目选项,用于定义flyway使用的数据库中的表名,其中包含有关此数据库版本的信息,已应用的脚本...

答案 7 :(得分:1)

实际上还有另一种解决方案,但它是一种解决方法,不应该在正确管理的项目中完成。然而,我遇到了一种情况,那里无法走上更好的道路:)

您可以更新schame_version表,并实际将校验和更改为新校验和。这将导致迁移通过,但可能会产生其他副作用。

当部署到不同的环境(测试,uat,prod等)时,可能会发生,您必须在更多环境中更新相同的校验和。当谈到gitflow和发布分支时,你可以很容易地混淆整体。

答案 8 :(得分:1)

只需添加

spring.flyway.enabled=false
如果您不希望flyway每次运行应用程序时检查校验和,请在application.properties文件中输入

答案 9 :(得分:0)

只是不验证:

flyway.setValidateOnMigrate(false);

答案 10 :(得分:0)

有3种方法可以在开发时解决此问题。下面的任何人都可以解决此问题。
1)在版本递增的新迁移sql文件中提供更改
2)更改我们提供的数据库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

答案 11 :(得分:0)

我遇到了同样的问题,并尝试了所有选项(删除架构,删除特定行,更新校验和),但是没有任何效果。

在我的情况下,flyway-core依赖因某种原因被破坏了。

解决方案:

  1. 从〜.m2 \本地存储库路径... \ org \ flywaydb \ flyway-core中删除flyway-core文件夹。

  2. 执行“ maven全新安装”,以便它将下载新的更新并将其添加到项目中。

我希望这会有所帮助。

答案 12 :(得分:0)

遇到此问题时,我所做的就是连接到数据库并更新与错误版本相对应的校验和字段,并将该值放置在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和本机SQL手动修复模式。

答案 13 :(得分:0)

如果您在生产中遇到问题,则必须具有 V2__create_shipwreck.sql ,该版本与最新版本中未修改的版本相同。

然后校验和将再次正确

答案 14 :(得分:0)

我遇到了同样的问题,我相信这是由于linux和Windows(也包括mac)之间的校验和而发生的。 您可以flite -t "text i want to read"在飞行通道中命令。

use repair()

请注意,如果您处于生产环境中,请确保未更改迁移SQL文件;因为当您运行flyway.repair(); 时,这意味着您向flyway说您对迁移版本及其校验和有把握,然后由flyway对其进行修复!

答案 15 :(得分:0)

1-删除迁移文件。 2-连接到数据库并删除迁移创建的表。 3-使用正确的sql重新创建迁移文件。

答案 16 :(得分:0)

简单的解决方案是将application.properties中的spring.datasource.url = jdbc:h2:file:〜/ dasboot更改为新文件名,例如:spring.datasource.url = jdbc:h2:file:〜/ dasboots

答案 17 :(得分:0)

如果您确定SQL文件中的修改对现有架构没有影响,则还可以更新现有架构的校验和。

我在对sql文件稍作更改后进行了此操作。

这是我更新校验和的方法:

update flyway_schema_history set checksum = '-1934991199' where installed_rank = '1';

答案 18 :(得分:0)

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)  ...

答案 19 :(得分:0)

更新您的schema_version记录,以便在本地解决问题&#34;你的情况下的价值是-1729781252