web-dev-qa-db-fra.com

Causé par: org.flywaydb.core.api.FlywayException: la validation a échoué. Correspondance de somme de contrôle de migration pour la migration 2

J'ai essayé de trouver la solution au problème ci-dessous, mais aucun d'entre eux n'a fonctionné pour moi. Je développe l'application Angular + Spring Boot à l'aide de MySQL + flyway. S'il vous plaît guider ce qui ne va pas ici.

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`));

 enter image description here

27
user5707585

Flyway compare la somme de contrôle du script SQL avec celle de la somme de contrôle exécutée précédemment. Cette exception se produit généralement si vous modifiez un script SQL qui a déjà été appliqué par Flyway, ce qui entraîne une non concordance de la somme de contrôle.

S'il s'agit de développement, vous pouvez supprimer votre base de données et lancer les migrations à partir de zéro.

Si vous êtes en production, ne modifiez jamais les scripts SQL déjà appliqués. Ne créez que de nouveaux scripts SQL à l'avenir.

37
Kyle Anderson

La meilleure solution serait de suivre ces étapes:

  1. Supprimez le fichier appelé - V2__create_shipwreck.sql, nettoyez-le et restaurez-le. 
  2. Exécutez à nouveau le projet, connectez-vous à h2 et supprimez la table "version_schema".

    drop table schema_version;

  3. Créez maintenant le fichier V2__create_shipwreck.sql avec ddl et réexécutez le projet.

  4. Rappelez-vous ceci, ajoutez la version 4.1.2 pour flyway-core dans pom.xml comme 

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>4.1.2</version>
    </dependency>
    

Cela devrait fonctionner maintenant. J'espère que cela aidera.

11
Indrajeet Gour

Je voudrais simplement supprimer de schema_version la migration/s qui diffère des migrations à appliquer. De cette façon, vous ne perdez pas les données de test que vous pourriez avoir.

Par exemple:

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

Migrations à appliquer

V_005_five.sql
* V_004_addUserTable.sql *
V_003_three.sql
V_002_two.sql
V_001_one.sql

La solution ici est de supprimer schema_version

V_005_five.sql
V_004_four.sql

ET annuler les modifications apportées à la base de données. Par exemple, si le schéma crée une nouvelle table, vous devez la supprimer avant d'exécuter vos migrations.

lorsque vous exécutez flyway, il ne fera que réappliquer

V_005_five.sql
* V_004_addUserTable.sql *

nouvelle schema_version sera

V_005_five.sql
* V_004_addUserTable.sql *
V_003_three.sql
V_002_two.sql
V_001_one.sql

J'espère que ça aide

7
Djalas

J'ai eu le même problème et j'ai supprimé le schéma complet de la base de données, mais le problème est resté.

J'ai résolu ce problème en exécutant la commande repair() de flyway:

  flyway.repair();

Je ne pouvais pas savoir ce qui n'allait pas.

5
dave

SI VOUS N'ETES PAS EN PRODUCTION, vous pouvez regarder dans votre flywayTable de la base de données et supprimer la ligne contenant le nom du script qui a été appliqué.

flywayTable est une option de projet qui définit le nom de la table dans la base de données utilisée par flyway qui contient des informations sur la version de cette base, les scripts déjà appliqués ...

1
Moebius

En réalité, il existe une autre solution, mais il s’agit d’une solution de contournement qui ne devrait pas être appliquée à un projet correctement géré. Cependant, j'ai rencontré une situation où il n'était pas possible d'aller dans le meilleur chemin :)

Vous pouvez mettre à jour la table schame_version et remplacer le total de contrôle par le nouveau. Cela entraînera la migration, mais peut avoir d'autres effets secondaires. 

Lors du déploiement dans différents environnements (test, utilisateur, produit, etc.), il peut arriver que vous deviez mettre à jour la même somme de contrôle sur plusieurs environnements. Et quand il s’agit de gitflow et de libérer des branches, vous pouvez facilement mélanger le tout. 

1
Márton Szabó

Mettez à jour votre enregistrement schema_version pour indiquer la valeur "Résolu localement", qui dans votre cas est -1729781252.

0
Bucher Arnold

Si vous êtes certain que la modification dans le fichier SQL n'a aucun impact sur votre schéma existant, vous pouvez également mettre à jour la somme de contrôle du schéma existant.

Je l’ai fait suite à une légère modification du fichier SQL.

Voici comment j'ai mis à jour la somme de contrôle:

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

Flyway a changé le mode de calcul des sommes de contrôle de la version 3 à la version 5. Vous pouvez recalculer les sommes de contrôle. Étant donné que le plug-in Flyway ne lit pas correctement les propriétés de la source de données Spring, vous devez les spécifier manuellement sur la ligne de commande ( ou l’une des autres façons dont Flyway accepte ). 

mvn flyway:repair -Dflyway.user=root -Dflyway.password= -Dflyway.url=jdbc:mysql://localhost:3306/mydatabase -Dflyway.table=schema_version

Flyway a également modifié la table dans laquelle elle stocke les sommes de contrôle. Vous devez donc également spécifier flyway-table=schema_version pour utiliser votre ancienne table. Sinon, cela vous avertira (et probablement une erreur dans la 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)  ...
0
Chloe