0Pricing
SQL Academy · Урок

Миграции без остановки: почему 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 — локальная установка не требуется.

Все уроки этого курса

  1. Миграции без остановки: почему ALTER TABLE блокирует таблицы
  2. Параллельное создание индексов (CREATE INDEX CONCURRENTLY)
  3. Переименование столбцов без остановки
  4. Инструменты: Flyway, Liquibase, Sqitch
← Назад к SQL Academy