Для чего используется Liquibase
Что проверяют
Понимаете ли вы, что это версионирование схемы базы, и знаете ли отличия от Flyway.
Как отвечать
Liquibase управляет изменениями схемы базы данных: хранит их в репозитории рядом с кодом, применяет по порядку и ведёт учёт применённого.
Как устроено: изменения описываются в журнале изменений (XML, YAML, JSON или обычный SQL), состоящем из отдельных наборов, у каждого свои идентификатор и автор. В самой базе создаются служебные таблицы: одна хранит список применённых наборов вместе с контрольной суммой, вторая обеспечивает блокировку, чтобы два экземпляра приложения не применяли миграции одновременно.
Что это даёт:
- воспроизводимость: любая база доводится до нужного состояния из чистого листа одной командой;
- защита от правки задним числом: изменили уже применённый набор, и контрольная сумма не сойдётся, применение остановится с ошибкой. Это не придирка, а защита от расхождения окружений;
- откат: для многих операций обратное действие генерируется автоматически, для остальных пишется вручную;
- условия применения: предусловия проверяют состояние базы перед выполнением, а контексты и метки позволяют применять часть изменений только на тестовом стенде;
- сравнение баз: команда сопоставления показывает расхождение между двумя базами и умеет сгенерировать миграцию.
Чем отличается от Flyway: Flyway проще и ориентирован на чистый SQL с нумерованными файлами. Liquibase даёт абстракцию над диалектом, то есть изменение можно описать независимо от конкретной СУБД, плюс встроенный откат и предусловия. Цена это более многословный формат и лишний слой.
Важное правило эксплуатации: миграции применяются отдельным шагом выкладки, а не при старте приложения. Иначе несколько экземпляров стартуют одновременно и упираются в блокировку, а неудачная миграция роняет весь запуск.
Где спотыкаются
Правят уже применённый набор изменений.
Пишут несколько изменений в один набор, из-за чего откат становится невозможным.
Не проверяют миграции на копии боевых данных.
Строят индекс на большой таблице обычной командой и блокируют запись.