EMZETT.
Войти

Изменения схемы без простоя: expand and contract

Коротко: В expand-and-contract схема базы данных меняется несколькими обратно совместимыми шагами, чтобы старые и новые версии программы работали в промежутке и простой не требовался.

Подробнее: Переименовать столбец кажется просто. Но если приложение работает в нескольких экземплярах или бывают откаты, жёсткое переключение может всё сломать: при развёртывании старые и новые версии работают одновременно. Поэтому изменения разбивают на совместимые шаги.

Подробности

Шаблон

  1. Expand (расширить): добавить новый столбец/таблицу (допускающий null или со значением по умолчанию), ничего старого не удалять.
  2. Писать в оба: приложение пишет и в старое, и в новое (двойная запись) и продолжает читать из старого.
  3. Backfill (заполнение): копировать существующие данные этапами (пакетами) в новую структуру.
  4. Переключить чтение: приложение читает из нового (флаг функции, проверка).
  5. Contract (уборка): лишь когда никакая версия больше не использует старое, старый столбец удаляется.

Пример: разделение столбца name на first_name и last_name

-- 1. Expand
ALTER TABLE users ADD COLUMN first_name text, ADD COLUMN last_name text;
-- 2. Приложение пишет name, first_name, last_name
-- 3. Заполнение пакетами
UPDATE users SET first_name = split_part(name,' ',1), last_name = split_part(name,' ',2)
  WHERE id BETWEEN 1 AND 10000 AND first_name IS NULL;
-- 4. Приложение читает first_name/last_name
-- 5. Contract (позже, отдельно)
ALTER TABLE users DROP COLUMN name;

Опасные операции

  • Переименование или удаление столбца, пока старые версии программы его используют.
  • NOT NULL без значения по умолчанию на большой таблице (может заблокировать таблицу).
  • Создание индекса без CONCURRENTLY (PostgreSQL) блокирует запись.
  • Смена типа (перезаписывает таблицу).
  • Большие обновления в одной транзакции (блокировки, отставание репликации). Всегда пакетами.
  • Миграции и развёртывание нужно согласовывать по времени.

Практика

Проверяйте миграции на копии с реалистичными объёмами данных. Резервные копии перед критическими шагами, план отката, версионируйте миграции и храните в репозитории. Инструменты: Flyway, Liquibase, Alembic, Prisma Migrate, Drizzle Kit, gh-ost/pg-osc для больших таблиц. Проверьте, не проще ли для небольших систем окно обслуживания, чем сложные многошаговые процедуры.

См. также: Миграция базы данных, Развёртывание blue-green и canary, Флаги функций, Стратегия резервного копирования