Миграции без остановки: почему ALTER TABLE блокирует таблицы
Разберитесь, какие формы ALTER TABLE устанавливают блокировку ACCESS EXCLUSIVE и переписывают таблицу, а какие изменяют только метаданные
«Миграции без остановки: почему ALTER TABLE блокирует таблицы» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Проблема миграции в рабочей среде
В небольшой базе данных ALTER TABLE выполняется мгновенно. Но в рабочей таблице объёмом 500 GB та же команда может заблокировать запись на 20 минут. Важно знать, какие операции ALTER безопасны, а какие — нет.
Уровни блокировок
В PostgreSQL блокировки имеют следующие уровни:
- ACCESS SHARE — запросы SELECT
- ROW EXCLUSIVE — операции записи
- SHARE / SHARE ROW EXCLUSIVE — операции DDL, выполняющиеся одновременно с чтением
- EXCLUSIVE — блокирует запросы SELECT
- ACCESS EXCLUSIVE — блокирует EVERYTHING
Что блокирует ALTER TABLE
Большинство вариантов ALTER получают блокировку ACCESS EXCLUSIVE — они блокируют чтение и запись до завершения операции.
Быстрые операции ALTER (только метаданные)
Некоторые операции ALTER изменяют только каталог и завершаются за миллисекунды даже для огромных таблиц:
ALTER TABLE t RENAME COLUMN a TO b;
ALTER TABLE t ALTER COLUMN a SET DEFAULT ...;
ALTER TABLE t ADD COLUMN x INT; -- nullable, no default: metadata only (PG 11+)
ALTER TABLE t ADD COLUMN x INT NOT NULL DEFAULT 0; -- metadata only PG 11+ if default is constantМедленные операции ALTER (перезапись)
Эти операции переписывают всю таблицу:
ALTER TABLE t ALTER COLUMN x TYPE BIGINT; -- when types not binary-compatible
ALTER TABLE t SET LOGGED;
CLUSTER t USING idx; -- physically reorders rows
VACUUM FULL t; -- rewrites whole tableБезопасное добавление NOT NULL
Для большой таблицы:
-- BAD: full table scan + ACCESS EXCLUSIVE lock
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
-- BETTER:
ALTER TABLE t ADD CONSTRAINT x_not_null CHECK (x IS NOT NULL) NOT VALID;
ALTER TABLE t VALIDATE CONSTRAINT x_not_null; -- scans without exclusive lock
-- then drop the CHECK and add NOT NULL (still cheap because already validated):
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
ALTER TABLE t DROP CONSTRAINT x_not_null;Добавление внешних ключей без остановки работы
Используется тот же приём с NOT VALID:
ALTER TABLE orders
ADD CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;Проблемы ожидания блокировок
Операция ALTER, ожидающая блокировку ACCESS EXCLUSIVE, встанет в очередь за каждой долго выполняющейся транзакцией. Более новые транзакции также встанут в очередь за ALTER — образуется цепочка заблокированных запросов.
Ограничение ожидания блокировки
Не позволяйте миграциям зависать навсегда:
SET lock_timeout = '5s';
ALTER TABLE t ...;
-- ERROR if it can't get the lock in 5s — retry.Циклы повторных попыток
Миграции должны повторять попытку после превышения времени ожидания блокировки:
for (let i = 0; i < 20; i++) {
try {
await client.query('SET lock_timeout = 5000');
await client.query('ALTER TABLE ...');
break;
} catch (e) {
if (e.code === '55P03') continue; // lock_not_available
throw e;
}
}Безопасность с ограничением времени выполнения оператора
Ограничьте время выполнения любого отдельного оператора внутри миграции:
SET statement_timeout = '30s';Полезные инструменты
- strong_migrations (Rails)
- django-migrate-zero-downtime
- pg-osc (изменение схемы Postgres без остановки работы)
- pgRoll
Итоги
Для миграций без остановки работы необходимо учитывать:
- Какие операции ALTER изменяют только метаданные, а какие переписывают таблицу
- Использование NOT VALID + VALIDATE для ограничений
- Настройку ограничения ожидания блокировки и повторные попытки
- Недопущение долгих транзакций, блокирующих миграции
Быстрая проверка
Вы добавляете ограничение NOT NULL к таблице объёмом 500 GB с помощью одной команды ALTER TABLE — что произойдёт с операциями записи?
Часто задаваемые вопросы
Урок «Миграции без остановки: почему ALTER TABLE блокирует таблицы» бесплатный?
Да — полный текст урока «Миграции без остановки: почему ALTER TABLE блокирует таблицы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Миграции без остановки: почему ALTER TABLE блокирует таблицы»?
Разберитесь, какие формы ALTER TABLE устанавливают блокировку ACCESS EXCLUSIVE и переписывают таблицу, а какие изменяют только метаданные Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Миграции без остановки: почему ALTER TABLE блокирует таблицы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Миграции без остановки: почему ALTER TABLE блокирует таблицы
- Параллельное создание индексов (CREATE INDEX CONCURRENTLY)
- Переименование столбцов без остановки
- Инструменты: Flyway, Liquibase, Sqitch