Что это значит

Оперативная память сервера здесь ни при чём. 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;

Последний запрос покажет процесс, который держит больше всего блокировок.

Что сделать

  1. Поднять max_locks_per_transaction с 64 до 256. Для баз с тысячами таблиц это обычная настройка.
  2. Изменение требует перезапуска базы.
  3. Если ошибку даёт pg_dump, этого достаточно. Если её даёт рабочий запрос, покажите запрос разработчикам: трогать тысячи объектов в одной транзакции редко нужно.