Что такое DATABASECHANGELOG и DATABASECHANGELOGLOCK?
DATABASECHANGELOG и DATABASECHANGELOGLOCK — две служебные таблицы, которые Liquibase автоматически создаёт в БД при первом запуске для отслеживания состояния миграций и предотвращения конкурентного выполнения.
DATABASECHANGELOG
Хранит информацию о каждом применённом changeset:
| Столбец | Описание |
|---|---|
ID |
Идентификатор changeset |
AUTHOR |
Автор changeset |
FILENAME |
Путь к файлу changelog |
DATEEXECUTED |
Дата и время применения |
ORDEREXECUTED |
Порядковый номер выполнения |
EXECTYPE |
Тип выполнения (EXECUTED, FAILED, SKIPPED, RERAN, MARK_RAN) |
MD5SUM |
Контрольная сумма (checksum) changeset |
DESCRIPTION |
Описание типа изменения |
COMMENTS |
Комментарий из changeset |
TAG |
Тег (если был проставлен) |
LIQUIBASE |
Версия Liquibase |
CONTEXTS |
Контексты changeset |
LABELS |
Метки changeset |
DEPLOYMENT_ID |
Идентификатор развёртывания |
DATABASECHANGELOGLOCK
Предотвращает одновременное выполнение миграций несколькими экземплярами приложения:
| Столбец | Описание |
|---|---|
ID |
Идентификатор (обычно 1) |
LOCKED |
Флаг блокировки (true/false) |
LOCKGRANTED |
Время установки блокировки |
LOCKEDBY |
Хост, который установил блокировку |
Перед началом миграции Liquibase устанавливает LOCKED = true, а после завершения — LOCKED = false. Если приложение аварийно завершилось во время миграции, блокировка может «зависнуть». В этом случае можно вручную снять блокировку:
Пример
liquibase releaseLocks
Или SQL:
Пример
UPDATE DATABASECHANGELOGLOCK SET LOCKED = FALSE, LOCKGRANTED = NULL, LOCKEDBY = NULL WHERE ID = 1;
На собеседовании: важно назвать обе таблицы и объяснить их назначение. Практический вопрос, который часто задают: «что делать, если блокировка зависла?» — нужно знать про releaseLocks.