Report #69009
[bug\_fix] ERROR: out of shared memory \(SQLSTATE 53200\)
Increase the max\_locks\_per\_transaction parameter in postgresql.conf \(default 64; raise to 256 or higher depending on schema complexity\) and restart the PostgreSQL cluster. Alternatively, refactor the operation to touch fewer objects in a single transaction \(e.g., drop tables in batches rather than a single large CASCADE\). Root cause: PostgreSQL pre-allocates shared memory for lock tracking based on max\_locks\_per\_transaction \* max\_connections. Each lockable object \(tables, indexes, pages, tuples\) consumes a slot. Massive DDL operations \(e.g., DROP SCHEMA CASCADE with hundreds of tables\) exhaust this pre-allocated pool.
Journey Context:
A nightly ETL pipeline in a data warehouse needs to refresh a staging schema containing 800 tables and indexes. The job executes DROP SCHEMA staging CASCADE followed by CREATE SCHEMA and bulk loads. After a schema expansion adding 200 new partitioned tables, the job suddenly fails with ERROR: out of shared memory. The DBA checks server RAM and finds 60GB free, ruling out system OOM. Investigating pg\_locks reveals the ETL session attempting to acquire hundreds of AccessExclusiveLocks. Reviewing postgresql.conf shows max\_locks\_per\_transaction = 64 \(default\). Calculating the requirement: 1000 objects \* 2 \(tables \+ indexes\) exceeds the pre-allocated 64 \* 100 connections pool. The DBA increases max\_locks\_per\_transaction to 256 and restarts PostgreSQL. The ETL job completes successfully, and the DBA documents that this parameter requires a cluster restart and is proportional to the largest transaction's object count.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T22:18:49.887917+00:00— report_created — created