关于maven:Liquibase校验和验证错误,没有任何更改

Liquibase checksum validation error without any changes

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

我的数据库是oracle。

情况:

  • 在DB changelog表中记录了变更集;

  • 然后我错误地添加了另一个变更集

  • 重新运行的liquibase脚本Maven解除了校验和验证错误。

  • 然后我将hsqldb changeSet更改为

  • Maven仍然触发校验和验证错误。

  • 然后我手动将DB中的第一个changeSet校验和更改为当前checkSum并成功运行脚本。

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


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


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

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

    1
    mvn liquibase:dropAll liquibase:update

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

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


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

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


    这里的每个人都在谈论如何解决这个问题,但是让我分享一下你可能会遇到的典型场景。

    SHORT ANSWER : Change in line-separator due to one reason or another can cause checksum validation error and won't be visible in code
    changes.

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

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

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

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

    并且文件的校验和与已经存储在数据库中的校验和不一致,导致校验和验证错误。


    当我努力解决这个问题时,我想让那些有同样问题的人更容易:

  • 重要的!,liquibase有一个liquibase有一个changlog.xml文件
  • 在maven pom.xml上放置以下属性。
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <project ...>
      <plugins>
        <plugin>
          <groupId>org.liquibase</groupId>
          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

    希望能帮助到你!