EMZETT.
Войти

Миграции базы данных без простоя

Коротко: Изменения схемы в работающей системе проходят без простоя, если разбить их на небольшие обратно совместимые шаги («expand and contract»).

Подробнее: При развёртывании старая и новая версии программы ненадолго работают рядом на одной и той же базе данных. Схема должна понимать обе.

Подробности

  • Expand: Добавлять новые столбцы или таблицы, ничего старого не убирая. Новые столбцы делать допускающими NULL или со значением по умолчанию.
  • Migrate: Новая версия программы пишет в оба места (старое и новое). Существующие данные копируются небольшими пачками в фоне.
  • Contract: Только когда всё переключено и проверено, удалять старое в одном из следующих релизов.
  • Пример переименования столбца: Не RENAME, а создать новый столбец, писать в оба, скопировать, переключить чтение, старый столбец удалить позже.
  • Опасные команды: В зависимости от базы данных ADD COLUMN со значением по умолчанию, построение индексов (используйте CREATE INDEX CONCURRENTLY) или смена типов блокируют всю таблицу.
  • Путь назад: Каждый шаг должен быть обратим в отдельности. Версионируйте миграции и выполняйте их в конвейере.
  • Инструменты: Flyway, Liquibase, Prisma Migrate, gh-ost (MySQL).

См. также: транзакции и ACID