Error de PostgreSQL: sorry, too many clients already

FATAL:  sorry, too many clients already

Cada slot de conexión del servidor está ocupado, así que PostgreSQL rechaza el nuevo. Por lo demás el servidor está sano — simplemente está lleno. Una variante cercana del mismo problema es el mensaje sobre "remaining connection slots are reserved": los últimos slots se reservan para superusuarios para que un administrador aún pueda entrar y arreglar las cosas.

Qué significa este error

PostgreSQL acepta como máximo max_connections conexiones concurrentes (por defecto: 100), y reserva unas cuantas de ellas (superuser_reserved_connections, por defecto: 3) para superusuarios. Cuando un cliente normal pide una conexión más allá del límite no reservado, obtiene este FATAL en el momento de conectar — la conexión se rechaza, nada más en el servidor se ve afectado.

Cada conexión es un proceso de servidor dedicado con su propia memoria, así que el límite existe por una razón: PostgreSQL no maneja miles de conexiones directas de forma elegante. Por eso la solución duradera casi nunca es "sube el número".

Causas comunes

Cómo diagnosticarlo

Conéctate como superusuario (para eso están los slots reservados) y mira quién sostiene los slots:

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;

-- Sesiones en transacción desde hace más tiempo (candidatas a fuga):
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;

Muchas conexiones idle apuntan a pools de aplicación sobredimensionados o con fugas; sesiones idle in transaction antiguas apuntan a código de aplicación que abrió una transacción y se despistó.

Cómo solucionarlo

🔍 Lectura relacionada: VACUUM & bloat — esas sesiones idle in transaction no solo consumen slots: retienen el vacuum de toda la base de datos.