Liquibase校验和验证错误,没有任何更改

Dag*_*eto 40 changeset liquibase maven

即使在变更集中没有进行任何更改,Maven也会触发liquibase验证失败.

我的数据库是oracle.

情况:

  1. 在DB changelog表中记录了变更集<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. 然后我手动将DB中的第一个changeSet校验和更改为当前checkSum并成功运行脚本.

一切看起来都不错,但是当我重新部署整个应用程序并运行liquibase脚本时,第一个changeSet的校验和仍然像之前的6步一样.

Roy*_*ove 65

如果您确信您的脚本正确反映了数据库中包含的内容,请运行liquibase:clearCheckSums maven目标,这将清除它们.

  • [错误] 在插件 org.liquibase:liquibase-plugin:1.9.6 中找不到目标 'clearCheckSums' :-( (2认同)
  • 对于gradle,它是`./gradlew liquibaseClearChecksums` (2认同)

Mar*_*nor 21

liquibase抛出校验和验证错误,表明应用于数据库的更改不再与liquibase变更集文件中指定的相同内容相匹配....

这是一种安全措施,旨在检测错误的规范文件,并且在开发过程中很容易发生.解决问题的最佳方法是删除所有对象并对开发环境运行liquibase,如下所示:

mvn liquibase:dropAll liquibase:update
Run Code Online (Sandbox Code Playgroud)

警告 - 这将删除架构中的所有对象.您将丢失表中的所有数据,以及任何不受Liquibase管理的对象.全面目标的文档

有时您实际上希望支持更改变更集.在这些情况下,liquibase支持"runOnChange"属性,该属性选择性地对数据库实例应用更改集.

  • 执行此命令之前要小心.它将删除数据库中的所有表,而不仅仅是与liquibase相关的表. (6认同)

Nan*_*dan 12

Liquibase 读取databasechangelog表格以验证最近的更改。所以找出databasechnagelog导致问题的id并删除,如下图:

select * from myschema.DATABASECHANGELOG;

Delete from myschema.DATABASECHANGELOG where ID='prob_id';
Run Code Online (Sandbox Code Playgroud)

在 Liquibase 中删除错误的变更日志


Adi*_*a T 9

这里的每个人都在谈论如何解决这个问题,但让我分享一个可能发生在您身上的典型场景。

简短回答:由于某种原因更改行分隔符可能导致校验和验证错误,并且在代码更改中不可见。

为什么会发生在我身上?请阅读下面..

假设你有一个tomcat服务器,不时有多人参与WAR部署。每个人都在 LINUX 上使用 INTELLIJ IDEA,但其中一名团队成员出于某种原因切换到 WINDOWS。现在,当 WINDOWS PERSON 将创建 WAR 时,他可能不会注意到 INTELLIJ IDEA for WINDOWS 中的默认行分隔符选择是 CRLF,但所有以前的构建都是从使用 LF 行分隔符的 LINUX 机器构建的。

行分隔符的更改会影响所有文本文件,其中也包括 SQL 文件。所以你可能在你的 liquibase 脚本中像我的团队一样使用了以下内容

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

并且文件的校验和与数据库中已存储的校验和不匹配,引发校验和验证错误。

  • 值得将其添加为一个单独的问题 - 最初的问题是“我更改了我的文件,然后 Liquibase 失败了,为什么?” 而这是“我没有更改我的文件,但 Liquibase *仍然*失败,为什么???!” (2认同)

Vov*_*kyi 7

在我的情况下,我忘记了Liquibase将所有chagelog写入数据库表。

转到DATABASECHANGELOG表并手动删除您的chagelog。


aca*_*a85 6

当我在解决这个问题时,我想让有同样问题的人变得更容易:

  1. 重要!,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>
Run Code Online (Sandbox Code Playgroud)

**** 版本是我在 url 中使用的 3.2.0 替换为正确的 IPADDRESS 和 PORT。

最后你跑了mvn liquibase:clearCheckSums

希望能帮助到你!


小智 5

liquibase 文档现在有第二个选项

The <validCheckSum> attribute

The second option is to add a <validCheckSum> element to the changeset. The text contents of the element should contain the old checksum from the error message.
Run Code Online (Sandbox Code Playgroud)

假设您很少需要更改历史变更日志 XML 文件,那么您很少会收到错误消息。如果您收到错误消息,请添加一个带有旧校验和的标签,确认没有问题。

例子:

    <changeSet id="example" author="former-author" runOnChange="false">
       <validCheckSum>8:869....4e3</validCheckSum>
       <addColumn tableName="ye_olde_db_table">
          <!-- fix some old typo or incompatibility, etc -->
       </addColumn>
    </changeSet>
Run Code Online (Sandbox Code Playgroud)