Миграция ждёт таблицу: ограничиваем ожидание через lock_timeout
Нужно добавить ограничение или изменить таблицу, но команда миграции несколько минут ничего не делает. Другие запросы тоже начинают ждать. Частая причина — транзакция, которая давно читает таблицу и ещё не завершилась, пока DDL пытается получить несовместимую блокировку.
Время ожидания блокировки и время исполнения команды — разные вещи. lock_timeout прерывает попытку слишком долгого получения блокировки. statement_timeout ограничивает длительность команды в целом. Для миграции полезно задать короткое ожидание, чтобы не держать очередь запросов неопределённо долго.
Как изменить решение
BEGIN;
SET LOCAL lock_timeout = '2s';
SET LOCAL statement_timeout = '30s';
ALTER TABLE orders ADD CONSTRAINT orders_amount_positive
CHECK (amount >= 0) NOT VALID;
COMMIT;
-- Проверку старых строк выполняем отдельно:
ALTER TABLE orders VALIDATE CONSTRAINT orders_amount_positive;Если нужная блокировка недоступна, первая транзакция завершится ошибкой вместо длительного ожидания. NOT VALID позволяет отделить установку ограничения от проверки уже существующих строк. Новые и изменяемые строки после установки обязаны выполнять CHECK.
После ошибки транзакцию нужно откатить, выяснить владельца блокировки и повторить миграцию в подходящий момент. Автоматически завершать чужие соединения по возрасту опасно для корректности операций. Сначала проверьте pg_stat_activity и pg_blocking_pids, включая состояние idle in transaction.
Что проверить на своих данных
В тестовом окружении оставьте открытой транзакцию с чтением orders, затем запустите DDL из второго соединения. Измерьте время до ошибки. После завершения первого соединения повторите миграцию и проверьте, что отрицательное значение не проходит, а старые нарушения обнаруживаются при VALIDATE.
SET LOCAL действует до конца текущей транзакции и не переносит настройки в следующее использование соединения из пула. Это особенно удобно для служебных команд. Подбирайте таймаут отдельно для проверки данных: VALIDATE на большой таблице может законно работать дольше, хотя необходимая ей блокировка уже получена.
Практика дальше
Изменение схемы затрагивает не только базу, но и потребителей данных. На Data Engineering Fast-Track вы работаете со схемами и контрактами, организуете зависимости через Airflow и собираете Kafka → Spark → Lakehouse. Это практическое продолжение для тех, кто сопровождает регулярные загрузки.
Посмотреть программу и практику курса
Источник: Миграция ждёт таблицу — официальная документация.
Другие задачи по теме: PostgreSQL: запись, блокировки и планы запросов.
Продолжить на практике
- Data Engineering Fast‑Track: Kafka → Airflow → Spark ↗
Практический fast-track по data engineering: за 4–6 недель собираем рабочий конвейер Kafka → Spark → Lakehouse под управлением Airflow. Разберём batch и streaming, окна и watermark, схемы и контракты. Мини‑проекты, Docker Compose, шаблоны DAG и пайплайнов. Курс подойдёт инженерам, аналитикам и тем, кто хочет освоить современные пайплайны данных с уверенным Python.
