PostgreSQL Error 53400: configuration_limit_exceeded — диагностика лимитов
- Ошибка:
ERROR: out of shared memory (SQLSTATE 53400). Detail: You might need to increase "max_locks_per_transaction". - Сбои при выполнении массивных DDL операций или миграций структуры метаданных конфигураций 1С.
- Ошибки при попытке захвата предикатных блокировок в транзакциях уровня Serializable.
1. Анализ ошибки переполнения таблицы блокировок
PostgreSQL хранит разделяемую таблицу блокировок в shared memory. Размер таблицы фиксируется при старте сервера по формуле: (max_locks_per_transaction) * (max_connections + max_prepared_transactions).
2. Увеличение max_locks_per_transaction в postgresql.conf
-- Для крупных баз 1С с десятками тысяч таблиц увеличьте параметр:
ALTER SYSTEM SET max_locks_per_transaction = 256; -- По умолчанию 64
-- Требуется перезапуск службы PostgreSQL3. Увеличение лимита предикатных блокировок (для SSI)
Если используется изоляция Serializable, увеличьте:
ALTER SYSTEM SET max_pred_locks_per_transaction = 128;
ALTER SYSTEM SET max_pred_locks_per_page = 4;4. Перезапуск сервиса СУБД
systemctl restart postgresql Частые вопросы (FAQ)
Почему ошибка out of shared memory указывает на configuration_limit_exceeded (53400)?
Потому что пул памяти под блокировки аллоцируется статически при запуске экземпляра. При открытии огромного количества таблиц в одной транзакции пул переполняется.
Влияет ли обновление конфигурации 1С на появление ошибки 53400?
Да, при реструктуризации сотен таблиц и индексов в одной неделимой транзакции платформа 1С открывает колоссальное количество lock-объектов, исчерпывая лимит.
Сколько оперативной памяти отнимает увеличение max_locks_per_transaction?
Сравнительно немного — увеличение параметра со 64 до 256 потребует всего несколько десятков мегабайт в shared memory.
Требуется ли перезагрузка сервера при изменении max_locks_per_transaction?
Да, этот параметр относится к статическим (postmaster) и не может быть применен через pg_reload_conf().