Главная / Справочник ошибок / PostgreSQL
Переполнена таблица блокировок PostgreSQL
ERROR: out of shared memory. HINT: You might need to increase max_locks_per_transaction
out of shared memory, increase max_locks_per_transaction: одна транзакция в PostgreSQL затронула слишком много таблиц и индексов. Когда поднимать параметр и что проверить сначала.
Что это значит
Оперативная память сервера здесь ни при чём. PostgreSQL держит таблицу блокировок фиксированного размера: max_locks_per_transaction × (max_connections + max_prepared_transactions). Транзакция, которая затрагивает очень много таблиц, индексов или секций, её переполняет.
Типичные источники: резервное копирование pg_dump базы с тысячами таблиц, массовое изменение структуры при обновлении системы, запросы к таблицам с большим числом секций.
Как проверить
show max_locks_per_transaction;
select count(*) from pg_locks;
select pid, count(*) from pg_locks group by 1 order by 2 desc limit 5;
Последний запрос покажет процесс, который держит больше всего блокировок.
Что сделать
- Поднять
max_locks_per_transactionс 64 до 256. Для баз с тысячами таблиц это обычная настройка. - Изменение требует перезапуска базы.
- Если ошибку даёт
pg_dump, этого достаточно. Если её даёт рабочий запрос, покажите запрос разработчикам: трогать тысячи объектов в одной транзакции редко нужно.