Выполнение команды Liquibase generateChangeLog в базе данных Oracle приводит к бездействию без вывода в файле журнала / консоли после определенного момента

#xml #oracle #command-line-interface #liquibase #ojdbc

#xml #Oracle #интерфейс командной строки #liquibase #ojdbc

Вопрос:

Я пытаюсь создать новый файл Liqubase DatabaseChangeLog.xml для существующей базы данных Oracle с конкретными схемами для извлечения структуры БД. Цель состоит в том, чтобы заменить существующие сценарии sql на формат набора изменений и заставить миграции Liquibase работать как с базами данных PostgreSQL, так и с базами данных Oracle.

Я указал свой liquibase.properties файл как:

 changeLogFile: DatabaseChangelog.xml
schemas: schema1,schema2,schema3
driver: oracle.jdbc.OracleDriver
classpath: ojdbc8.jar
url: jdbc:oracle:thin:@host:port:SID
username: User
password: PASSWORD
logLevel: debug
logFile: log.txt
  

Когда я делаю liquibase generateChangeLog в cli, я получаю следующий вывод:

 Liquibase Community 4.0.0 by Datical
Starting Liquibase at 12:44:52 (version 4.0.0 #19 built at 2020-07-13 19:45 0000)
  

и через некоторое время выводится ошибка:

 Unexpected error running Liquibase: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: Connection could not be created to jdbc:oracle:thin:@host:port:SID with driver oracle.jdbc.OracleDriver.  Possibly the wrong driver for the given database URL
For more information, please use the --logLevel flag
  

вывод log.txt не содержит сообщений об ошибках, и кажется, что liquibase хорошо подключена к базе данных, но журнал неожиданно заканчивается.
Вот фрагмент журнала:

 [2020-09-14 12:44:52] FINE [liquibase.database] Properties:
[2020-09-14 12:44:52] FINE [liquibase.database] Key:'password' Value:'**********'
[2020-09-14 12:44:52] FINE [liquibase.database] Key:'user' Value:'USER'
[2020-09-14 12:44:52] FINE [liquibase.database] Connecting to the URL:'jdbc:oracle:thin:@host:port:SID' using driver:'oracle.jdbc.OracleDriver'
[2020-09-14 12:44:52] FINE [liquibase.servicelocator] Loaded liquibase.database.DatabaseConnection instance liquibase.database.jvm.JdbcConnection
[2020-09-14 12:44:52] FINE [liquibase.servicelocator] Loaded liquibase.database.DatabaseConnection instance com.datical.liquibase.ext.database.jvm.ProJdbcConnection
[2020-09-14 12:44:59] FINE [liquibase.database] Connection has been created
[2020-09-14 12:45:00] FINE [liquibase.database] Connected to USER@jdbc:oracle:thin:@host:port:SID
[2020-09-14 12:45:00] FINE [liquibase.database] Setting auto commit to false from true
...
[2020-09-14 12:45:40] FINE [liquibase.executor] Executing with the 'jdbc' executor
  

Последняя строка является последней в файле журнала.

Версия Liquibase — это Community 4.0.0 , драйвер Oracle — это ojdbc8.jar .

У меня есть ojdbc8.jar в том же каталоге, что и liquibase.properties .

Учетные данные БД и пользователя верны, и я могу подключиться к базе данных с помощью dbForge (в tnsnames.ora формате с тем же адресом и учетными данными пользователя).

У кого-нибудь была такая же проблема при попытке создать новую DatabaseChangeLog.xml из существующей базы данных Oracle? Я буду рад видеть любые предложения.

Заранее спасибо.

Отредактировано: на самом деле это дало мне результат после 1 часа работы:

 Unexpected error running Liquibase: liquibase.exception.DatabaseException: java.sql.SQLRecoverableException: No data to read from socket
For more information, please use the --logLevel flag
  

Но в схемах есть данные / таблицы.

Ответ №1:

Вы можете использовать инструмент командной строки для генерации журналов изменений из существующей схемы. Используйте следующую команду и помните о дополнительных пробелах, поскольку liquibase будет жаловаться на это.

Не забудьте скопировать ojdbc8-19.3.0.0.jar в lib папку liquibase-zip, загруженную из указанного ниже местоположения. Я загрузил liquibase.zip отсюда и используется следующая команда liquibase_zip

 liquibase.bat --driver=oracle.jdbc.driver.OracleDriver --url="jdbc:oracle:thin:@localhost:1521/orcl" --username=TEST_A --password=test --changeLogFile=db.test.xml generateChangeLog
  

Или
вы можете использовать тот же метод.Я заменил свойства, подобные этому, в файле liquibase.properties, и он работает нормально.Обратите внимание, что между

ключ = значение

 changeLogFile=DatabaseChangelog.xml
schemas=TEST
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521/service_name
username=TEST_A
password=password
logLevel=debug
logFile=log.txt
  

Для SID замените URL следующим образом

 url=jdbc:oracle:thin:@localhost:1521:sid
  

Комментарии:

1. Спасибо за ответ! Я заменил свойства так, как вы упомянули, без пробелов и обозначения ‘=’, но я все равно получаю тот же результат. Использование косой черты / вместо точки с запятой : прямо перед идентификатором SID в URL также не повлияло на поведение команды generateChangeLog. Я также пытался использовать другие версии ojdbc.jar безуспешно.

2. Вы получаете ту же ошибку? Можете ли вы попробовать сгенерировать журналы изменений для одной схемы и посмотреть. Вы пробовали первый подход?