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, Прапорці функцій, Стратегія резервного копіювання