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