PostgreSQL-Fehler: sorry, too many clients already

FATAL:  sorry, too many clients already

Jeder Verbindungs-Slot auf dem Server ist belegt, daher verweigert PostgreSQL den neuen. Der Server ist ansonsten gesund — er ist einfach voll. Eine nahe Variante desselben Problems ist die Meldung über "remaining connection slots are reserved": die letzten paar Slots werden für Superuser zurückgehalten, damit ein Administrator noch hineinkommen und die Dinge in Ordnung bringen kann.

Was dieser Fehler bedeutet

PostgreSQL akzeptiert höchstens max_connections gleichzeitige Verbindungen (Standard: 100) und reserviert einige davon (superuser_reserved_connections, Standard: 3) für Superuser. Wenn ein regulärer Client eine Verbindung über das nicht reservierte Limit hinaus anfordert, erhält er dieses FATAL zum Verbindungszeitpunkt — die Verbindung wird verweigert, nichts anderes auf dem Server ist betroffen.

Jede Verbindung ist ein eigener Serverprozess mit eigenem Speicher, daher existiert das Limit aus gutem Grund: PostgreSQL verkraftet Tausende direkter Verbindungen nicht anmutig. Deshalb ist die dauerhafte Lösung fast nie "die Zahl erhöhen".

Häufige Ursachen

So diagnostizieren Sie ihn

Verbinden Sie sich als Superuser (dafür sind die reservierten Slots da) und schauen Sie, wer die Slots hält:

SHOW max_connections;

SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state ORDER BY count(*) DESC;

SELECT usename, application_name, count(*)
FROM pg_stat_activity
GROUP BY 1, 2 ORDER BY count(*) DESC;

-- Sitzungen, die am längsten in einer Transaktion sind (Leak-Kandidaten):
SELECT pid, usename, state, now() - xact_start AS xact_age, left(query, 60)
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start
LIMIT 10;

Viele idle-Verbindungen deuten auf überdimensionierte oder leckende Anwendungs-Pools hin; alte idle in transaction-Sitzungen deuten auf Anwendungscode hin, der eine Transaktion geöffnet und sich davongemacht hat.

So beheben Sie ihn

🔍 Weiterführend: VACUUM & Bloat — jene idle in transaction-Sitzungen fressen nicht nur Slots: sie halten das Vacuum für die gesamte Datenbank zurück.