Давно пользуюсь Liquibase, и ему это нравится. Однако в проекте, над которым я сейчас работаю, я столкнулся с проблемой, которую, похоже, не смогу найти причину.
Я могу запустить каждый файл changelog / feature /*.xml из командной строки (используя обновление), и все будет успешно.
Я могу запустить каждый db.changelog - *. xml файл (кроме главного) из командной строки (используя обновление), и все будет успешно.
Но когда я пытаюсь запустить файл 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). Они были удалены, но проблема все еще существует.
Запуск:
- macOS Catalina 10.15.3
- openjdk версия "1.8.0_242"
- Среда выполнения OpenJDK (Zulu 8.44.0.11- CA-macosx) (сборка 1.8.0_242-b20)
- Виртуальная 64-разрядная серверная виртуальная машина OpenJDK (Zulu 8.44.0.11-CA-macosx) (сборка 25.242-b20, смешанный режим)
- Oracle База данных 11g Enterprise Edition, выпуск 11.2.0.2.0
- 64-битная версия PL / SQL Релиз 11.2.0.2.0, версия
- CORE 11.2.0.2.0, версия
- TNS для Linux: Версия 11.2.0.2.0 Производство
- NLSRTL Версия 11.2.0.2.0 Производство
- Liquibase 3.8.0
Пробовал все, что я можно думать о. У кого-нибудь есть мысли?
ОБНОВЛЕНИЕ APR-29-2020 У меня есть немного больше информации - я обнаружил, ЧТО происходит, и план исправить это не работает.
Что: Очевидно, Liqiubase изменил путь includeAll где-то между версиями 3.4.2 и 3.5.5: См. https://forum.liquibase.org/topic/upgrade-from-3-4-2-to-3-5-5-includeall-issues?reply=true
Я скопировал нашу настройку liquibase из устаревшая система, работающая 3.4.2. В файле db.changelog-master. xml он имеет <includeAll path="/features"/>
(ведущий sla sh). Однако на новом проекте я обновился до 3.8.0. И includeAll - это то, что вызывает исключение.
Новое значение <includeAll path="features/"/>
(трейлинг сл sh). Формат столбца FILENAME в DATABASECHANGELOG такой же, то есть features / 20191024-LD-1. xml
В документации есть команда обслуживания командной строки, которая идеально подходит для этого исправления: cleanCheckSums. По сайту:
Удаляет текущие контрольные суммы из базы данных. При следующем обновлении для наборов изменений, которые уже были развернуты, их контрольные суммы будут пересчитаны, а наборы изменений, которые не были развернуты, будут развернуты.
Проблема заключается в том, что yes, cleanCheckSums обнуляет столбец MD5SUM, столбец EXECTYPE равен EXECUTED, и каждая строка имеет заполненный DEPLOYMENT_ID, но следующая команда обновления пытается перезапустить все наборы изменений.
Вот план, который мы создали для исправления:
Шаги
Измените путь к параметру includeAll в db.changelog-master.xml
:
<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 для исправления имени файла столбца базы данных в ожидаемом формате
Представляется точно такого же формата:
old: features/20191024-LD-1.xml
new test: 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
Кто-нибудь знает, что мне не хватает?