ventajas una tecnicas riesgos realizar plan pasos para migracion inmigración datos caracteristicas aplicaciones almacenamiento java spring-boot flyway

java - una - tecnicas de migracion de datos



Causado por: org.flywaydb.core.api.FlywayException: error de validación. Desajuste de suma de comprobación de migración para la migración 2 (8)

Actualice su registro schema_version para procesar el valor "Resuelto localmente" que en su caso es -1729781252

Traté de encontrar la solución para el problema a continuación, pero ninguno de ellos funcionó para mí. Estoy desarrollando la aplicación Angular + Spring Boot usando MySQL + flyway . Por favor, guía qué está mal aquí.

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


En realidad, hay otra solución, pero es una solución alternativa, que no debe hacerse en un proyecto adecuadamente gestionado. Sin embargo, me encontré con una situación en la que no era posible ir por el mejor camino :)

Puede actualizar la tabla schame_version y, de hecho, cambiar la suma de comprobación a la nueva. Esto hará que la migración se realice, pero puede tener otros efectos secundarios.

Cuando se implementa en diferentes entornos (prueba, uat, prod, etc.), puede suceder que tenga que actualizar la misma suma de comprobación en más entornos. Y cuando se trata de gitflow y de liberar sucursales, puedes mezclar todo fácilmente.


Flyway cambió la forma en que calcula las sumas de comprobación de la versión 3 a la versión 5. Puede volver a calcular las sumas de comprobación. Dado que el complemento Flyway no lee correctamente las propiedades del origen de datos Spring, debe especificarlas manualmente en la línea de comandos ( o en una de las otras formas en que Flyway acepta ).

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

Flyway también cambió la tabla en la que almacena las sumas de comprobación, por lo que también debe especificar flyway-table=schema_version para usar su tabla anterior, de lo contrario, le dará una advertencia (y probablemente un error en la versión 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) ...


Flyway está comparando la suma de comprobación del script SQL con la de la suma de comprobación ejecutada anteriormente. Esta excepción suele ocurrir si cambia una secuencia de comandos SQL que ya ha sido aplicada por Flyway, lo que provoca una discrepancia en la suma de comprobación.

Si esto es desarrollo, puede eliminar su base de datos e iniciar las migraciones desde cero.

Si está en producción, nunca edite los scripts SQL que ya se han aplicado. Sólo crea nuevos scripts SQL en el futuro.


La mejor solución sería hacer estos pasos:

  1. Elimine el archivo llamado - V2__create_shipwreck.sql, limpie y vuelva a generar el proyecto.
  2. Ejecute el proyecto nuevamente, inicie sesión en h2 y elimine la tabla llamada "schema_version".

    drop table schema_version;

  3. Ahora haga el archivo V2__create_shipwreck.sql con ddl y vuelva a ejecutar el proyecto nuevamente.

  4. Recuerde esto, agregue la versión 4.1.2 para flyway-core en pom.xml como

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

Debería funcionar ahora. Espero que esto ayude.


SI NO ESTÁ EN PRODUCCIÓN, puede buscar en su flywayTable de flywayTable en la base de datos y eliminar la línea que contiene el nombre del script que se ha aplicado.

flywayTable es una opción de proyecto que define el nombre de la tabla en la base de datos utilizada por flyway que contiene información sobre la versión de esta base de datos, scripts ya aplicados ...


Simplemente eliminaría de schema_version las migraciones que se desvían de las migraciones que se aplicarán. De esta manera no desechará ningún dato de prueba que pueda tener.

Por ejemplo:

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

Migraciones a aplicar.

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

La solución aquí es eliminar de schema_version

V_005_five.sql V_004_four.sql

Y revertir cualquier cambio en la base de datos causado. por ejemplo, si el esquema creó una nueva tabla, entonces debe eliminar esa tabla antes de ejecutar las migraciones.

Cuando corres, solo se volverá a aplicar.

V_005_five.sql * V_004_addUserTable.sql *

nueva schema_version será

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

Espero eso ayude


Tuve el mismo problema y eliminé el esquema completo de la base de datos, pero el problema permaneció.

Resolví esto ejecutando el comando repair() de flyway:

flyway.repair();

No pude averiguar qué fue exactamente lo que salió mal.