长期使用Liquibase并喜欢它。但是,在我目前正在从事的项目中,我遇到了一个似乎无法找到原因的问题。
我可以从命令行(使用更新)运行每个 changelog / feature / *。xml文件,一切成功。
我可以从命令行(使用更新)运行每个 db.changelog-*。xml文件(master除外),一切都成功。
但是当我尝试运行db.changelog-master文件时,我得到了:
Starting Liquibase at Tue, 14 Apr 2020 11:49:47 CDT (version 3.8.0 built at 2019-08-15T20:38:06Z)
Liquibase Community 3.8.0 by Datical
Unexpected error running Liquibase: Unknown reason
liquibase.exception.ChangeLogParseException: liquibase.exception.SetupException
at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:25) ~[liquibase.jar:na]
at liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:217) ~[liquibase.jar:na]
at liquibase.Liquibase.update(Liquibase.java:190) ~[liquibase.jar:na]
at liquibase.Liquibase.update(Liquibase.java:179) ~[liquibase.jar:na]
at liquibase.integration.commandline.Main.doMigration(Main.java:1223) [liquibase.jar:na]
at liquibase.integration.commandline.Main.run(Main.java:209) [liquibase.jar:na]
at liquibase.integration.commandline.Main.main(Main.java:132) [liquibase.jar:na]
Caused by: liquibase.exception.SetupException: null
at liquibase.changelog.DatabaseChangeLog.includeAll(DatabaseChangeLog.java:531) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.handleChildNode(DatabaseChangeLog.java:398) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.load(DatabaseChangeLog.java:308) ~[liquibase.jar:na]
at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:23) ~[liquibase.jar:na]
... 6 common frames omitted
Caused by: java.lang.NullPointerException: null
at java.util.AbstractCollection.addAll(AbstractCollection.java:343) ~[na:1.8.0_242]
at liquibase.integration.commandline.CommandLineResourceAccessor.list(CommandLineResourceAccessor.java:44) ~[liquibase.jar:na]
at liquibase.resource.CompositeResourceAccessor.list(CompositeResourceAccessor.java:40) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.includeAll(DatabaseChangeLog.java:506) ~[liquibase.jar:na]
... 9 common frames omitted
For more information, please use the --logLevel flag
我确实找到了在项目研究期间针对不同架构创建的旧视图和触发器,这些视图和触发器从未在此视图中运行(在此DATABASECHANGELOG中均未运行)。它们已被删除,但问题仍然存在。
运行:
尝试了所有我能想到的。有人有什么想法吗?
更新APR-29-2020
什么: 显然,Liqiubase在版本3.4.2和3.5.5之间的某个位置更改了includeAll路径: 参见https://forum.liquibase.org/topic/upgrade-from-3-4-2-to-3-5-5-includeall-issues?reply=true
我已从运行3.4.2的旧系统复制了liquibase设置。在db.changelog-master.xml文件中,它具有<includeAll path="/features"/>
(斜杠)。但是,在新项目上,我升级到3.8.0。而includeAll就是引发异常的原因。
新值为<includeAll path="features/"/>
(斜线)。 DATABASECHANGELOG中FILENAME列的格式是相同的,即features / 20191024-LD-1.xml
在文档中,有一个命令行维护命令看上去很适合此修复程序:cleanCheckSums。根据网站:
从数据库中删除当前的校验和。在下一个更新变更集 已经部署的将重新计算其校验和, 并将部署尚未部署的变更集。
挑战是,cleanCheckSums将MD5SUM列设置为空,EXECTYPE列为EXECUTED,并且每一行都有填充的DEPLOYMENT_ID,但是下一条更新命令将尝试重新运行所有变更集。
这是我们为修复程序创建的计划:
步骤
更改db.changelog-master.xml
中的includeAll参数路径:
<includeAll path="features/"/>
运行清算clearCheckSums:
$LIQUIBASE_HOME/liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \
--url={pathToDatabase} \
--username={dbUserName} \
--password={dbUserPass} \
clearCheckSums
SQL将数据库列文件名固定为期望的格式
似乎是完全相同的格式:
旧版:features/20191024-LD-1.xml
新测试:features/20200429-deleteme.xml
运行主更新:
$LIQUIBASE_HOME/liquibase \
--driver=oracle.jdbc.OracleDriver \
--classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \
--url={pathToDatabase} \
--changeLogFile=db.changelog-master.xml \
--username={dbUserName} \
--password={dbUserPass} \
update
有人知道我想念什么吗?
答案 0 :(得分:1)
请尝试以下命令:
liquibase changelogSync
此命令将在DATABASECHANGELOG跟踪表中为db.changelog-master.xml changeSet创建相应的行,并考虑已部署的那些changeSet。