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