58

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

我的数据库是oracle。

情况:

  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 脚本时,第一个 changeSet 的校验和仍然像第 6 步之前一样。

4

9 回答 9

84

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

于 2012-04-03T19:56:11.127 回答
23

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

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

mvn liquibase:dropAll liquibase:update

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

有时您实际上想要支持更改集。在这些情况下,liquibase 支持“runOnChange”属性,该属性选择性地将变更集应用于数据库实例。

于 2012-04-03T19:46:43.847 回答
13

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

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

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

假设你有一个 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)
}

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

于 2018-07-20T10:47:53.193 回答
13

Liquibase 读取databasechangelog表格以验证最近的更改。因此,确定databasechangelog导致问题的 id 并删除,如下所示:

select * from myschema.DATABASECHANGELOG;

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

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

于 2019-09-10T14:12:55.883 回答
12

就我而言,我忘记了Liquibase将所有更改日志写入数据库表。

转到DATABASECHANGELOG表并手动删除您的更改日志。

于 2017-12-28T13:56:53.870 回答
4

当我在这个问题上挣扎时,我想让有同样问题的人更容易:

  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>

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

最后你跑mvn liquibase:clearCheckSums

希望能帮助到你!

于 2016-04-04T07:54:05.963 回答
0

在maven插件中配置liquibase的数据库链接信息。

像这样:

<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>
于 2019-11-13T01:54:36.890 回答
0

变更集 ID 不应重复。提供一个新的变更集 id 并尝试,它应该可以工作。

<changeSet id=
于 2020-06-25T09:31:26.247 回答
0

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.

假设您很少需要更改历史更改日志 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>
于 2022-03-01T20:01:51.320 回答