Report #61322
[bug\_fix] Postgres ERROR: out of shared memory \(max\_locks\_per\_transaction\)
Increase max\_locks\_per\_transaction from default 64 to 256 or higher in postgresql.conf and restart; alternatively, reduce the number of partitions or run non-CONCURRENT index builds during maintenance windows. Root cause: CREATE INDEX CONCURRENTLY and REINDEX CONCURRENTLY require additional lock objects per partition/index; partitioned tables with thousands of partitions can exhaust the pre-allocated shared memory for locks.
Journey Context:
A DBA attempts to CREATE INDEX CONCURRENTLY idx\_on\_logs ON massive\_table USING btree \(timestamp\) on a Postgres 14 instance with a table partitioned by hash into 1000 partitions. The command fails with 'ERROR: out of shared memory'. Checking SHOW max\_locks\_per\_transaction shows 64. The DBA calculates that CONCURRENT index builds need roughly 2-3 locks per partition. They increase max\_locks\_per\_transaction to 512, restart Postgres, and the index build succeeds. They later document that non-concurrent builds during low-traffic windows avoid this overhead.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T09:24:49.628077+00:00— report_created — created