Ошибка проверки контрольной суммы Liquibase без изменений

Maven вызывает сбой проверки ликвибазы, даже если в набор изменений не было внесено никаких изменений.

Моя база данных - оракул.

Ситуация:

  1. В таблице изменений БД была запись для набора изменений <changeSet id="1" author="me" dbms="oracle">;

  2. Затем по ошибке я добавил еще одну ревизию <changeSet id="1" author="me" dbms="hsqldb">

  3. Перенастроенные скрипты Liquibase Maven выдал ошибку проверки контрольной суммы.

  4. Затем я изменил hsqldb changeSet на <changeSet id="2" author="me" dbms="hsqldb">

  5. Maven все еще запускает ошибку проверки контрольной суммы.

  6. Затем я вручную изменил первую контрольную сумму changeSet в БД на текущую контрольную сумму, и скрипты были успешно запущены.

Все выглядит хорошо, но когда я повторно развертываю все приложение и запускаю скрипты Liquibase, контрольная сумма first changeSet остается такой же, как и до 6 шага.


person Daggeto    schedule 03.04.2012    source источник


Ответы (8)


Если вы уверены, что ваши сценарии правильно отражают то, что должно находиться в базе данных, запустите Liquibase: clearCheckSums maven, которая все очистит.

person Roy Truelove    schedule 03.04.2012
comment
[ОШИБКА] Не удалось найти цель clearCheckSums в плагине org.liquibase: liquibase-plugin: 1.9.6 :-( - person Patrick Cornelissen; 05.06.2013
comment
@PatrickCornelissen Глядя на ссылку ниже, кажется, что версия плагина, которую вы используете, довольно старая - вероятно, есть более новая версия под другим именем? search.maven.org/ - person Roy Truelove; 05.06.2013
comment
Для gradle это ./gradlew liquibaseClearChecksums - person agilob; 15.05.2018
comment
mvn liquibase: clearCheckSums ## выполнить в папке проекта - person Allahbakash.G; 01.11.2018

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

Это мера безопасности, предназначенная для обнаружения неверных файлов спецификаций, которая может легко произойти во время разработки. Лучший способ решить проблему - отбросить все объекты и запустить Liquibase в среде разработки следующим образом:

mvn liquibase:dropAll liquibase:update

Предупреждение - это приведет к удалению всех объектов в схеме. Вы потеряете все данные в таблицах и любой объект, не управляемый Liquibase. Документация по универсальной цели

Иногда вы действительно хотите поддержать изменение набора изменений. В таких случаях Liquibase поддерживает атрибут runOnChange, который выборочно применяет наборы изменений к экземпляру базы данных. .

person Mark O'Connor    schedule 03.04.2012
comment
Будьте осторожны перед выполнением этой команды. Он удалит все таблицы в вашей базе данных, а не только таблицы, связанные с Liquibase. - person ; 20.06.2013
comment
@Joel Fair предупреждение. В моем случае все мои таблицы управляются Liquibase - person Mark O'Connor; 17.07.2014

Liquibase читает таблицу databasechangelog, чтобы проверить последние изменения. Итак, определите databasechnagelog id, который вызывает проблему, и удалите, как показано ниже:

select * from myschema.DATABASECHANGELOG;

Delete from myschema.DATABASECHANGELOG where ID='prob_id';

Удаление плохого журнала изменений в Liquibase

person Nandan    schedule 10.09.2019
comment
Это действительно спасло меня! - person Philippe Gioseffi; 10.06.2020

В моем случае я забыл, что Liquibase записывает все журналы изменений в таблицу базы данных.

Перейдите в таблицу DATABASECHANGELOG и вручную удалите журналы изменений.

person Vova Perebykivskyi    schedule 28.12.2017

Все здесь говорят о том, как это исправить, но позвольте мне рассказать вам о типичном сценарии, в котором это может произойти.

КРАТКИЙ ОТВЕТ. Изменение разделителя строк по той или иной причине может вызвать ошибку проверки контрольной суммы и не будет отображаться при изменении кода.

Почему это произошло со мной? Пожалуйста, прочтите ниже ..

Предположим, у вас есть сервер tomcat, и несколько человек время от времени участвуют в развертывании WAR. Все используют INTELLIJ IDEA на LINUX, но один из членов команды по какой-то причине переходит на WINDOWS. Теперь, когда WINDOWS PERSON создаст WAR, он может не заметить, что в INTELLIJ IDEA для WINDOWS выбран разделитель строк по умолчанию - CRLF, но во всех предыдущих сборках, созданных на компьютере LINUX, который использует разделитель строк LF.

Изменение разделителя строк влияет на все текстовые файлы, включая файлы SQL. Так что вы, возможно, использовали подписку, как и моя команда, в своем скрипте Liquibase

changeSet(author: "aditya", id: "1335831637231-1") {
    sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true)
}

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

person Aditya T    schedule 20.07.2018
comment
Стоит добавить это как отдельный вопрос - исходный вопрос заключался в том, что я изменяю свои файлы, а затем Liquibase не работает, почему? в то время как это я не менял свои файлы, но Liquibase все еще не работает, почему ???! - person Andrew Spencer; 24.01.2019
comment
Я не уверен, разрешено ли нам это, но да, это может помочь людям лучше в том же сценарии, с которым я столкнулся. - person Aditya T; 24.01.2019
comment
С моей точки зрения, этот ответ был полезен. Обратите внимание, это появляется как первый результат при поиске контрольной суммы, не прошедшей валидацию ликвидной базы. - person Thomas Carlisle; 20.06.2021

Пока я борюсь с этим, я хочу облегчить жизнь людям с той же проблемой:

  1. Важно! В Liquibase есть Liquibase с файлом changlog.xml
  2. В maven pom.xml разместите следующие свойства.

<project ...>
  <plugins>
    <plugin>
      <groupId>org.liquibase</groupId>
      <artifactId>liquibase-maven-plugin</artifactId>
      <version>*****</version>
      <configuration>
        <changeLogFile>src/main/resources/mychangelogfile.xml</changeLogFile>
        <driver>oracle.jdbc.driver.OracleDriver</driver>
        <url>jdbc:oracle:thin:@//X.X.X.X:PORT/XE</url>
        <username>yourusername</username>
        <password>password</password>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>clearCheckSums</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</project>

**** версию, которую я использовал 3.2.0 в URL-адресе, замените правильным IPADDRESS и PORT.

Наконец вы запустите mvn liquibase:clearCheckSums

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

person acabra85    schedule 04.04.2016

Настройте информацию о ссылке на базу данных Liquibase в плагине maven.

нравится:

<plugin>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-maven-plugin</artifactId>
  <version>${liquibase.version}</version>
  <configuration>
    <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile>
    <driver>com.mysql.cj.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/hos_gateway</url>
    <username>root</username>
    <password>root</password>
    <referenceUrl>hibernate:spring:com.hos.physician.domain?dialect=org.hibernate.dialect.MySQL5InnoDBDialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
    <verbose>true</verbose>
    <logging>debug</logging>
    <contexts>!test</contexts>
  </configuration>
</plugin>
person GuoGuang0536    schedule 13.11.2019

Идентификатор набора изменений не должен повторяться. Дайте новый идентификатор набора изменений и попробуйте, он должен работать.

<changeSet id=
person Deepti Mohan    schedule 25.06.2020