maven Liquibase校验和验证错误,无任何变更

cnh2zyt3  于 2022-12-11  发布在  Maven
关注(0)|答案(9)|浏览(151)

即使在变更集中未进行任何变更,Maven也会触发liquibase验证失败。
我的数据库是oracle。
情况:

  1. DB变更日志表中记录了变更集<changeSet id="1" author="me" dbms="oracle">;
    1.然后我错误地添加了另一个变更集<changeSet id="1" author="me" dbms="hsqldb">
    1.重新运行liquibase脚本Maven引发校验和验证错误。
    1.然后我将hsqldb changeSet更改为<changeSet id="2" author="me" dbms="hsqldb">
  2. Maven仍触发校验和验证错误。
    1.然后,我将DB中的第一个changeSet校验和手动更改为当前校验和,脚本成功运行。
    一切看起来不错,但当我重新部署整个应用程序,并运行liquibase脚本校验和的第一个changeSet仍然像之前的6步。
0g0grzrc

0g0grzrc1#

变更集ID不应重复。请给予新的变更集ID并尝试,它应该可以工作。

<changeSet id=
mklgxw1f

mklgxw1f2#

在我的例子中,changelog.yml文件有不正确的id。
数据库变更记录档:

  • 更改集:ID:第1.0.xx版
7lrncoxx

7lrncoxx3#

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

fgw7neuy

fgw7neuy4#

在我的情况下,我忘记了 Liquibase 将所有更改日志写入数据库表。
转到 * ASECHANGELOG * 表,手动删除更改日志。

lrl1mhuk

lrl1mhuk5#

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

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

为什么会发生在我身上?请阅读以下内容..
假设你有一个tomcat服务器,并且有多个人经常参与WAR部署。每个人都在LINUX上使用INTELLIJ IDEA,但是其中一个团队成员由于某种原因切换到了WINDOWS。现在,当WINDOWS PERSON创建WAR时,他可能没有注意到在INTELLIJ IDEA for WINDOWS中默认的行分隔符选择是CRLF,而所有以前的构建都是从LINUX机器上构建的,它使用LF行分隔符。
行分隔符的更改会影响所有文本文件,包括SQL文件。因此,您可能像我的团队一样在liquibase脚本中使用了以下内容

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

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

a8jjtwal

a8jjtwal6#

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

select * from myschema.DATABASECHANGELOG;

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

Deleting a bad changelog in Liquibase

eit6fx6z

eit6fx6z7#

As I struggle with this one I want to make it easier for people with this same issue:

  1. Important!, liquibase has a liquibase has a changlog.xml file
  2. On the maven pom.xml place the following properties.
<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>

**** version the one I used 3.2.0 in url replace with proper IPADDRESS and PORT.

Finally you run mvn liquibase:clearCheckSums
Hope it helps!

hgb9j2n6

hgb9j2n68#

The liquibase documentation has a 2nd option now

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.

Assuming you rarely have to change historic changelog XML files, then you rarely have error messages. If you get an error message then add a tag with the old checksum acknowledging it's fine.
Example:

<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>
rsaldnfx

rsaldnfx9#

在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>

相关问题