Проблема с целостностью при оптимизации журнала изменений на базе Liquibase (исключение ValidationFailedException: ошибка проверки)

#spring #spring-boot #hibernate #liquibase

#spring #spring-boot #спящий режим #liquibase

Вопрос:

Через некоторое время я хотел бы оптимизировать changelog использование в своем Spring-Boot приложении. Я использую SQL синтаксис в своих файлах liquibase.

Я обновил некоторые старые sqll (без изменения имени набора изменений). И теперь я получил:

     Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
         37 change sets check sum
              classpath:db/changelog/db.changelog-master.sql::4::siewer was: 8:8560502cf93e550076df8a7dc82a45b6 but is now: 8:543d80fbaa5a5b468e56ac6ef4705e58
  

Возможно ли изменить старое changesets и обновить hashes без выполнения миграции? Я бы хотел, чтобы уже используемые базы данных работали без изменений (но чтобы иметь возможность получать новые миграции). В этот момент, когда я запускаю приложение со свежей базой данных, все в порядке, но когда я хочу запустить приложение в уже заполненной базе данных, я получаю ошибки.

Какие-нибудь советы? Возможно ли это сделать?

Ответ №1:

Вы можете запускать свои сценарии миграции для чистой базы данных, копировать хэши (или копировать их непосредственно из журнала ошибок один за другим) и обновлять хэш непосредственно в таблице liquibase. Просто убедитесь, что он обновляется вместе с развертыванием новых наборов изменений, иначе приложение не запустится.

Ответ №2:

Да, это возможно. Вы можете использовать <validCheckSum> для этого. Это сообщит liquibase, какова на самом деле контрольная сумма для этого набора изменений.

Итак:

 <changeSet id="foo" author="bar">
    <validCheckSum>your_checksum_here</validCheckSum>
    <!-- changeSet logic here -->
</changeSet>
  

Или, если вас вообще не волнует контрольная сумма набора изменений, вы можете использовать ANY вместо фактической контрольной суммы:

 <changeSet id="foo" author="bar">
    <validCheckSum>ANY</validCheckSum>
    <!-- changeSet logic here -->
</changeSet>
  

И некоторая философия по этому поводу:

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