Базы данных6 мин чтения
Миграции схемы без простоя
Добавлять безопасно, удалять безопасно позже, а ломает именно переименование. Паттерн expand-and-contract в том порядке, в котором он реально работает.
Во время любого деплоя есть окно, когда старый и новый код работают с одной базой. Каждая безопасная миграция следует из этого факта, а каждая небезопасная его игнорирует.
Expand, migrate, contract
- Expand: добавьте новую колонку или таблицу. Старый код её игнорирует, новый может использовать.
- Задеплойте код, который пишет и в старую, и в новую форму.
- Заполните существующие строки партиями, пока всё продолжает работать.
- Задеплойте код, который читает только новую форму.
- Contract: удалите старую колонку в следующем релизе, когда на неё больше ничто не ссылается.
Операции, с которыми надо быть аккуратным
- Переименование колонки: никогда за один шаг. Это добавить, заполнить, переключить, удалить.
- Добавление колонки NOT NULL без значения по умолчанию, что переписывает таблицу.
- Создание индекса на большой таблице без опции concurrent, что блокирует запись.
Пять скучных деплоев дешевле одного увлекательного.