Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

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.

Полезные материалы
Рекомендуем