Изменения схемы без простоя: expand and contract
Коротко: В expand-and-contract схема базы данных меняется несколькими обратно совместимыми шагами, чтобы старые и новые версии программы работали в промежутке и простой не требовался.
Подробнее: Переименовать столбец кажется просто. Но если приложение работает в нескольких экземплярах или бывают откаты, жёсткое переключение может всё сломать: при развёртывании старые и новые версии работают одновременно. Поэтому изменения разбивают на совместимые шаги.
Подробности
Шаблон
- Expand (расширить): добавить новый столбец/таблицу (допускающий null или со значением по умолчанию), ничего старого не удалять.
- Писать в оба: приложение пишет и в старое, и в новое (двойная запись) и продолжает читать из старого.
- Backfill (заполнение): копировать существующие данные этапами (пакетами) в новую структуру.
- Переключить чтение: приложение читает из нового (флаг функции, проверка).
- 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, Флаги функций, Стратегия резервного копирования