Вызвано: org.flywaydb.core.api.FlywayException: подтверждение не выполнено. Миграция контрольной суммы для миграции 2

Я попытался найти решение проблемы ниже, но никто из них не работал у меня. Я разрабатываю приложение Angular + Spring Boot, используя MySQL + flyway. Пожалуйста, расскажите, что здесь происходит.

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

введите описание изображения здесь

Ответ 1

Flyway сравнивает контрольную сумму SQL script с контрольной суммой ранее запускаемой контрольной суммы. Это исключение обычно возникает, если вы изменили SQL script, который уже был применен Flyway, что вызывает несоответствие контрольной суммы.

Если это разработка, вы можете удалить свою базу данных и начать миграцию с нуля.

Если вы работаете, никогда не редактируйте SQL-скрипты, которые уже были применены. Создавайте только новые сценарии SQL.

Ответ 2

Лучшим решением было бы сделать следующие шаги:

  • Удалите файл с именем - V2__create_shipwreck.sql, очистите и снова создайте проект.
  • Запустите проект еще раз, войдите в h2 и удалите таблицу с именем "schema_version".

    drop table schema_version;

  • Теперь сделайте файл V2__create_shipwreck.sql с ddl и снова запустите проект.

  • Помните об этом, добавьте версию 4.1.2 для flyway-core в pom.xml, например

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

Теперь он должен работать. Надеюсь, это поможет.

Ответ 3

У меня была та же проблема, и я удалил полную схему из базы данных, но проблема осталась.

Я решил это, выполнив команду repair() flyway:

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

Я бы просто удалил из 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

И отменить любые изменения базы данных, вызванные. например, если схема создала новую таблицу, вы должны удалить эту таблицу перед запуском миграции.

при запуске пролетного пути он будет только повторно применяться

V_005_five.sql
* V_004_addUserTable.sql *

новая схема_версии будет

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

Надеюсь, поможет

Ответ 5

Если вы уверены, что изменение в файле SQL не повлияет на вашу существующую схему, вы также можете обновить контрольную сумму существующей схемы.

Я сделал это после небольшого изменения в файле sql.

Вот как я обновил контрольную сумму:

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

Ответ 6

ЕСЛИ ВЫ НЕ В ПРОИЗВОДСТВЕ, вы можете посмотреть в flywayTable в базе данных и удалить строку, содержащую имя script, которое было применено.

flywayTable - это опция проекта, которая определяет имя таблицы в db, используемой flyway, которая содержит информацию о версии этого db, уже применяемые скрипты...

Ответ 7

На самом деле есть другое решение, но это обходное решение, которое не должно выполняться в правильно управляемом проекте. Однако я встретил ситуацию, когда не удалось спуститься по лучшей дороге:)

Вы можете обновить таблицу schame_version и фактически изменить контрольную сумму на новую. Это приведет к миграции, но может иметь другие побочные эффекты.

При развертывании в разных средах (test, uat, prod и т.д.) может случиться так, что вам нужно обновить одну и ту же контрольную сумму в других средах. И когда дело доходит до gitflow и освобождает ветки, вы можете легко смешивать все.

Ответ 8

Простым решением будет заменить spring.datasource.url = jdbc: h2: file: ~/dasboot в application.properties на новое имя файла, например: spring.datasource.url = jdbc: h2: file: ~/dasboots

Ответ 9

Обновите свою запись schema_version, чтобы обработать значение "Разрешено локально", которое в вашем случае равно -1729781252

Ответ 10

Flyway изменил способ вычисления контрольных сумм с версии 3 до версии 5. Вы можете пересчитать контрольные суммы. Поскольку плагин Flyway не читает свойства источника данных Spring должным образом, вы должны вручную указать их в командной строке (или другом способе, который принимает Flyway).

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

Ответ 11

1-Удалить файл миграции. 2-подключитесь к вашей базе данных и удалите таблицу, созданную при миграции. 3-воссоздать файл миграции с правами sql.

Ответ 12

У меня была та же проблема, и я считаю, что это произошло из-за контрольной суммы между Linux и Windows (также Mac). Вы можете use repair() команду use repair() на пролетном пути.

flyway.repair();

Будьте осторожны, если вы находитесь в производственной среде, убедитесь, что вы не изменили файл миграции SQL; потому что при запуске flyway.repair(); это означает, что вы говорите flyway, что вы уверены в версии миграции и их контрольной сумме, а затем flyway исправляет их!

Ответ 13

Здесь решение, которое работало для меня, когда у меня была эта проблема в моей локальной системе.

  1. Перейдите к flyway_schema_history в своей БД
  2. Удалить строку, содержащую скрипт миграции sql

Ответ 14

Если у вас есть проблема в работе, вы должны иметь V2__create_shipwreck.sql идентично той, которая есть в вашей последней версии, где она не была изменена.

Тогда контрольная сумма снова будет правильной