即使没有在变更集中进行任何更改,Maven也会激活liquibase验证失败。
我的数据库是oracle。
情况:
在DB更改日志表中记录了变更集<changeSet id="1" author="me" dbms="oracle">
;
然后我错误地添加了另一个变更集<changeSet id="1" author="me" dbms="hsqldb">
重新运行liquibase脚本Maven解决了校验和验证错误。
然后我将hsqldb changeSet更改为<changeSet id="2" author="me" dbms="hsqldb">
Maven仍在触发校验和验证错误。
然后我手动将DB中的第一个changeSet校验和更改为当前checkSum并成功运行脚本。
一切看起来都不错,但是当我重新部署整个应用程序并运行liquibase脚本时,第一个changeSet的校验和仍然像之前的6步。
答案 0 :(得分:58)
如果您确信您的脚本正确反映了应该在数据库中的内容,请运行liquibase:clearCheckSums maven目标,这将清除它们。
答案 1 :(得分:19)
liquibase抛出校验和验证错误,表明应用于数据库的更改不再与liquibase变更集文件中指定的相同内容相匹配....
这是一种安全措施,旨在检测错误的规范文件,并且在开发过程中很容易发生。解决问题的最佳方法是删除所有对象并对开发环境运行liquibase,如下所示:
mvn liquibase:dropAll liquibase:update
警告 - 这将删除架构中的所有对象。您将丢失表中的所有数据,以及任何不受Liquibase管理的对象。 drop-all goal
的文档有时您确实希望支持更改变更集。在这些情况下,liquibase支持"runOnChange"属性,该属性选择性地将更改集应用于数据库实例。
答案 2 :(得分:6)
在我的情况下,我忘了 Liquibase 将所有chagelog写入数据库表。
转到 DATABASECHANGELOG 表并手动删除您的chagelog。
答案 3 :(得分:3)
这里的每个人都在谈论如何解决此问题,但让我分享一个可能会发生的典型情况。
最短答案:由于某种原因而导致的行分隔符更改可能导致校验和验证错误,并且在代码中不可见 更改。
为什么会发生在我身上?请阅读下面的内容。
假设您有一台tomcat服务器,并且不时有多个人参与WAR部署。每个人都在LINUX上使用INTELLIJ IDEA,但是其中一个团队成员出于某种原因而切换到WINDOWS。 现在,当WINDOWS PERSON创建WAR时,他可能不会注意到WINDOWS的INTELLIJ IDEA中默认的行分隔符选择是CRLF,但是以前的所有版本都是使用LF行分隔符从LINUX机器构建的。
换行符的更改会影响所有文本文件,其中也包括SQL文件。因此,您可能像在我的liquibase脚本中一样使用了我的团队
changeSet(author: "aditya", id: "1335831637231-1") {
sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true)
}
并且文件的校验和与数据库中已经存储的校验和不匹配,抛出校验和验证错误。
答案 4 :(得分:2)
当我努力解决这个问题时,我想让那些有同样问题的人更容易:
<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
希望它有所帮助!
答案 5 :(得分:1)
Liquibase读取databasechangelog
表以验证最近的更改。
因此,确定引起问题的databasechnagelog
ID并删除,如下所示:
select * from myschema.DATABASECHANGELOG;
Delete from myschema.DATABASECHANGELOG where ID='prob_id';
答案 6 :(得分: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&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
<verbose>true</verbose>
<logging>debug</logging>
<contexts>!test</contexts>
</configuration>
</plugin>
答案 7 :(得分:0)
变更集ID不应重复。给出一个新的变更集ID并尝试,它应该可以工作。
Localizer["Register"].Value