Непредвиденная ошибка при запуске Liquibase: неизвестная причина Throwing NPE - PullRequest
0 голосов
/ 14 апреля 2020

Давно пользуюсь 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, но следующая команда обновления пытается перезапустить все наборы изменений.

Вот план, который мы создали для исправления:

Шаги

  1. Измените путь к параметру includeAll в db.changelog-master.xml:
    <includeAll path="features/"/>

  2. Запустить ликвидирование clearCheckSums:
    $LIQUIBASE_HOME/liquibase \ --driver=oracle.jdbc.OracleDriver \ --classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \ --url={pathToDatabase} \ --username={dbUserName} \ --password={dbUserPass} \ clearCheckSums

  3. SQL для исправления имени файла столбца базы данных в ожидаемом формате
    Представляется точно такого же формата:
    old: features/20191024-LD-1.xml
    new test: features/20200429-deleteme.xml

  4. Запустить обновление мастера:
    $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

Кто-нибудь знает, что мне не хватает?

1 Ответ

0 голосов
/ 30 апреля 2020

Попробуйте следующую команду:

liquibase changelogSync

Эта команда создаст соответствующие строки для db.changelog-master. xml changeSets в таблице отслеживания DATABASECHANGELOG и рассмотрит эти changeSets как развернутые.

...