Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
PG_OUT_OF_SHARED_MEMORY Linux / DevOps

Траблшутинг ошибки PostgreSQL out of shared memory: расчет max_locks_per_transaction

Обновлено: 21.08.2026
  • Выполнение сложных запросов, миграций или дампов прерывается ошибкой ERROR: out of shared memory.
  • В логах PostgreSQL присутствует подсказка: HINT: You might need to increase max_locks_per_transaction.
  • Сбои в базах данных с тысячами партиционированных таблиц (Declarative Partitioning) при параллельных транзакциях.

1. Архитектура таблицы блокировок в Shared Memory PostgreSQL

Размер общей таблицы блокировок в разделяемой памяти рассчитывается при старте сервера по формуле:

Total_Lock_Slots = (max_connections + max_prepared_transactions) * max_locks_per_transaction

Если суммарное число объектов, заблокированных открытыми транзакциями, превышает этот пул, PostgreSQL аварийно прерывает запрос.

2. Расчет и изменение параметров в postgresql.conf

Отредактируйте файл postgresql.conf:

# Увеличьте лимит блокировок на транзакцию (по умолчанию: 64)
max_locks_per_transaction = 256

# Если используется партиционирование с сотнями секций:
# max_locks_per_transaction = 512

# Убедитесь, что max_pred_locks_per_transaction также увеличен при изоляции Serializable
max_pred_locks_per_transaction = 256

3. Перезапуск службы PostgreSQL

Так как размер пула блокировок выделяется в Shared Memory при инициализации, изменение требует полного перезапуска СУБД:

# Debian / Ubuntu
systemctl restart postgresql

# RHEL / Rocky Linux
systemctl restart postgresql-15

4. Проверка примененных настроек

SHOW max_locks_per_transaction;
Практический опыт инженера: Если ошибка возникает во время создания резервной копии pg_dump, увеличьте max_locks_per_transaction на время снятия бэкапа или выполняйте pg_dump по отдельным схемам.

Частые вопросы (FAQ)

Почему партиционирование таблиц вызывает ошибку out of shared memory?

При обращении к родительской таблице планировщик PostgreSQL блокирует саму родительскую таблицу и каждую ее отдельную секцию. Запрос к таблице со 100 партициями мгновенно захватывает более 100 слотов блокировок.

Приведет ли увеличение max_locks_per_transaction к высокому расходу RAM?

Нет, каждый слот блокировки занимает несколько сотен байт. Увеличение параметра с 64 до 512 потребует всего несколько десятков мегабайт дополнительной памяти в Shared Memory.