В настоящее время я оцениваю Liquibase как решение для управления версиями базы данных в следующей среде:
Ubuntu 16.04 LTS
Java 1.8.0_181
MySQL, Connector / J 8.0
MySQL 5.7
Liquibase 3.6.2
Я настроил два док-контейнера MySQL 5.7 на портах 4408 и 4409 для тестирования. Базы данных на 4409 были загружены с моей схемой базы данных dev из mysqldump (нет данных), а базы данных на 4408 остались пустыми. Я сгенерировал журнал изменений из текущего состояния моей базы данных разработки на порту 4409, а затем (после интеграции подпрограмм и триггеров) я запустил обновление liquibase для пустых баз данных на порту 4408. Затем я выполнил diffChangeLog, ссылаясь на базы данных на порту 4409. Полученное изменение журнал имел два отличия:
Теги <column>
в тегах <creatTable>
в журнале изменений, сгенерированные из моих баз данных dev, содержат все примечания к столбцам. Но, очевидно, существует открытый выпуск , где атрибут remarks игнорируется для столбцов mysql типа первичный ключ. Поэтому, когда журнал изменений использовался для обновления пустых баз данных, все замечания по столбцам типа первичный ключ не были включены. Поэтому в список изменений diff включены наборы изменений, включающие замечания:
<setColumnRemarks columnName="PRIMARY_KEY_COLUMN" remarks="SOME REMARKS" tableName="myTable"/>
При применении diff changelog к базам данных на 4408 я получаю эту ошибку:
$ liquibase --logLevel=debug update
Starting Liquibase at Thu, 30 Aug 2018 11:08:58 PDT (version 3.6.2
built at 2018-07-03 11:28:09)
Thu Aug 30 11:08:58 PDT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Unexpected error running Liquibase: Validation Failed:
83 changes have validation failures
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-1::(generated)
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-2::(generated)
.
.
.
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-82::(generated)
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-83::(generated)
liquibase.exception.ValidationFailedException: Validation Failed:
83 changes have validation failures
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-1::(generated)
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-2::(generated)
.
.
.
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-82::(generated)
setColumnRemarks is not supported on mysql, mydb.changelog-diff-1.0.xml::1535652431878-83::(generated)
at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:276)
at liquibase.Liquibase.update(Liquibase.java:198)
at liquibase.Liquibase.update(Liquibase.java:179)
at liquibase.integration.commandline.Main.doMigration(Main.java:1205)
at liquibase.integration.commandline.Main.run(Main.java:191)
at liquibase.integration.commandline.Main.main(Main.java:129)
Я не могу найти никакой документации для тега <setColumnRemarks>
на веб-сайте liquibase, и он упоминается только один раз в LIQUIBASE 3.5.0 RELEASE : [CORE-2497] - Поддержка setColumnRemarks и setTableRemarks на MSSQL .
Когда я применил журнал изменений, сгенерированный из баз данных dev, к пустым базам данных, в результате в пустых базах данных некоторые представления преобразовывали некоторые значения запроса в UTF8 CONVERT( QUERY_VALUE USING UTF8)
, которые не были преобразованы в базу данных dev, ни журнал изменений. Поэтому в diff changelog включены эти представления без дополнительных преобразований. При применении diff changelog к базам данных на 4408 я получаю эту ошибку:
$ liquibase --logLevel=debug update
Starting Liquibase at Thu, 30 Aug 2018 11:12:54 PDT (version 3.6.2 built at 2018-07-03 11:28:09)
Thu Aug 30 11:12:55 PDT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Unexpected error running Liquibase: Table 'myView' already exists [Failed SQL: CREATE VIEW mydb.myView AS ... ]
liquibase.exception.MigrationFailedException: Migration failed for change set mydb.changelog-diff-1.0.xml::1535652431878-86::(generated):
Reason: liquibase.exception.DatabaseException: Table 'myView' already exists [Failed SQL: CREATE VIEW mydb.myView AS ... ]
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:637)
at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:53)
at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:78)
at liquibase.Liquibase.update(Liquibase.java:202)
at liquibase.Liquibase.update(Liquibase.java:179)
at liquibase.integration.commandline.Main.doMigration(Main.java:1205)
at liquibase.integration.commandline.Main.run(Main.java:191)
at liquibase.integration.commandline.Main.main(Main.java:129)
Caused by: liquibase.exception.DatabaseException: Table 'myView' already exists [Failed SQL: CREATE VIEW mydb.myView AS ...]
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:356)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:57)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:125)
at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1229)
at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1211)
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:600)
... 7 common frames omitted
Caused by: java.sql.SQLSyntaxErrorException: Table 'myView' already exists
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:781)
at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:666)
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:352)
... 12 common frames omitted
Теги createView в списке изменений diff имеют следующие атрибуты:
<createView fullDefinition="false" replaceIfExists="true" viewName="myView">
Теги createView в журнале изменений, сгенерированные из dev, имеют следующие атрибуты:
<createView fullDefinition="false" remarks="" viewName="myView">
В соответствии с изменениями в версии 3.5.0 liquibase CreateView игнорирует replaceIfExists = true, когда fullDefinition = true. Но в обоих логах изменений fullDefinition="false"
и в логе изменений diff raplaceIfExists="true"
. Поэтому сгенерированный SQL должен был быть CREATE OR REPLACE VIEW mydb.myView AS ...
.
Я не слишком обеспокоен замечаниями, но replaceIfExists="true"
для тега createView должно работать. Я почти собираюсь включить дамп mysql в свой набор изменений в качестве основы, а затем приступить к реализации надлежащих наборов изменений в будущем, но я действительно предпочел бы не делать этого, если я буду использовать liquibase.