RE:NODE
Обзор хостинга

Базы данных6 мин чтения

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

Добавлять безопасно, удалять безопасно позже, а ломает именно переименование. Паттерн expand-and-contract в том порядке, в котором он реально работает.


Во время любого деплоя есть окно, когда старый и новый код работают с одной базой. Каждая безопасная миграция следует из этого факта, а каждая небезопасная его игнорирует.

Expand, migrate, contract

  1. Expand: добавьте новую колонку или таблицу. Старый код её игнорирует, новый может использовать.
  2. Задеплойте код, который пишет и в старую, и в новую форму.
  3. Заполните существующие строки партиями, пока всё продолжает работать.
  4. Задеплойте код, который читает только новую форму.
  5. Contract: удалите старую колонку в следующем релизе, когда на неё больше ничто не ссылается.

Операции, с которыми надо быть аккуратным

  • Переименование колонки: никогда за один шаг. Это добавить, заполнить, переключить, удалить.
  • Добавление колонки NOT NULL без значения по умолчанию, что переписывает таблицу.
  • Создание индекса на большой таблице без опции concurrent, что блокирует запись.
Пять скучных деплоев дешевле одного увлекательного.