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:
- Elimine el archivo llamado - V2__create_shipwreck.sql, limpie y vuelva a generar el proyecto.
Ejecute el proyecto nuevamente, inicie sesión en h2 y elimine la tabla llamada "schema_version".
drop table schema_version;
Ahora haga el archivo V2__create_shipwreck.sql con ddl y vuelva a ejecutar el proyecto nuevamente.
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.