Report #10507
[bug\_fix] ERROR: out of shared memory \(max\_locks\_per\_transaction exceeded\)
Increase max\_locks\_per\_transaction in postgresql.conf \(requires cluster restart\) to accommodate the number of locks held by large DDL or bulk operations; alternatively break operations into smaller batches to reduce concurrent lock objects.
Journey Context:
Data warehouse team runs a massive CREATE INDEX CONCURRENTLY on a 500M row table while parallel COPY operations load other partitions. Suddenly, new queries fail with ERROR: out of shared memory. HINT: You might need to increase max\_locks\_per\_transaction. Investigation reveals that each row lock \(tuple lock\) and object lock consumes shared memory slots from a pre-allocated pool sized by max\_locks\_per\_transaction \* \(max\_connections \+ autovacuum\_max\_workers \+ max\_prepared\_transactions\). The huge CREATE INDEX CONCURRENTLY requires a ShareUpdateExclusiveLock on the table plus tuple locks on many rows, exhausting the lock table. The DBA calculates that current max\_locks\_per\_transaction is 64 \(default\), insufficient for this workload. They increase it to 256 in postgresql.conf and restart the cluster \(as it's a pre-allocated shared memory structure\). They also break the bulk load into 10k row batches with commits between, reducing the number of row locks held at once. After restart, the massive DDL runs successfully without shared memory exhaustion.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T10:51:18.456278+00:00— report_created — created