PostgreSQL-Fehler: out of shared memory

ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

Trotz der alarmierenden Formulierung geht es fast nie darum, dass dem Server generell der Speicher ausgeht. Wenn es mit dem max_locks_per_transaction-Hinweis kommt, bedeutet es eine bestimmte Sache: die gemeinsame Lock-Tabelle — die Struktur fester Größe, in der PostgreSQL Locks auf Tabellen, Indizes und anderen Objekten verfolgt — ist voll.

Was dieser Fehler bedeutet

Die Lock-Tabelle wird beim Serverstart dimensioniert, mit Platz für etwa max_locks_per_transaction × (max_connections + max_prepared_transactions) Objekt-Locks. Zwei Eigenschaften erklären alles, was Sie beobachten:

Jede Tabelle, Partition und jeder Index, den eine Query anfasst, braucht einen eigenen Lock-Eintrag, gehalten bis zum Ende der Transaktion. Das ist die Arithmetik, die Sie erwischt: eine Query über eine Tabelle mit 2.000 Partitionen und je einigen Indizes kann viele Tausend Einträge brauchen — während die Standarddimensionierung (64 × ~100 Verbindungen) Ihnen rund 6.400 für den gesamten Server gibt.

Häufige Ursachen

So diagnostizieren Sie ihn

Während die fehlschlagende Arbeitslast läuft (oder kurz bevor sie fehlschlägt):

-- Wie voll die Lock-Tabelle ist:
SELECT count(*) FROM pg_locks;

-- Wer die Einträge verbraucht:
SELECT pid, count(*)
FROM pg_locks
GROUP BY pid
ORDER BY count(*) DESC
LIMIT 10;

Vergleichen Sie die Gesamtzahl mit der obigen Formel bei Ihren Einstellungen. Wenn eine PID Tausende Locks hält, schauen Sie, was sie ausführt — und wenn Partitionen beteiligt sind, zählen Sie sie: SELECT count(*) FROM pg_inherits WHERE inhparent = 'events'::regclass;

So beheben Sie ihn

🔍 Weiterführend: Wie man EXPLAIN ANALYZE liest — der Plan zeigt Ihnen, ob das Partition-Pruning tatsächlich stattgefunden hat.