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) } |
并且文件的校验和与已经存储在数据库中的校验和不一致,导致校验和验证错误。
当我努力解决这个问题时,我想让那些有同样问题的人更容易:
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替换。
最后你运行
希望能帮助到你!