Report #76303
[bug\_fix] Postgres out of shared memory \(53200\) during DDL
Increase the kernel SHMMAX parameter to allow larger shared memory segments, and increase PostgreSQL's max\_locks\_per\_transaction \(requires restart\), or reduce max\_connections as a workaround. Root cause: Postgres pre-allocates shared memory for lock tables at startup based on max\_locks\_per\_transaction \* max\_connections; heavy DDL on partitioned tables or massive CREATE INDEX operations exhaust this pre-allocated pool.
Journey Context:
Running a migration to add a non-nullable column with default to a 10TB partitioned table with 10,000 partitions. The ALTER TABLE command fails immediately with ERROR: out of shared memory \(SQLSTATE 53200\). Investigation reveals that each partition operation requires a lock object, and 10,000 partitions \* current max\_locks\_per\_transaction \(64\) \* max\_connections \(100\) exceeds the pre-allocated shared memory segment size limited by kernel shmmax=33554432 \(32MB\). The database cannot dynamically allocate more shared memory. Temporary workaround: reduce max\_connections to 50 via ALTER SYSTEM \(which takes effect on reload, not requiring restart for new connections\), freeing up slots in the lock table calculation. Permanent fix: increase /proc/sys/kernel/shmmax to 1GB and max\_locks\_per\_transaction to 256, requiring a full restart. The migration is then run with a lower connection count to succeed.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T10:39:55.819199+00:00— report_created — created