PostgreSQL 'too many connections' Hatası: Teşhis ve Acil Müdahale
Bağlantı sınırına ulaşıldığında yeni bağlantıların reddedilmesini adım adım çözer. Sorumlu uygulamayı bulur, güvenli şekilde yer açar ve kalıcı çözümü anlatır.
Operasyonel Güvenlik ve Risk Uyarısı
Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.
1. Belirti / Symptom
- İstemci hatası: `FATAL: sorry, too many clients already` veya `FATAL: remaining connection slots are reserved for non-replication superuser connections`.
- Uygulamada bağlantı zaman aşımları, 5xx hataları.
- M1 (bağlantı doluluk oranı) %90 üzeri.
2. Etki / Impact
Yeni bağlantılar reddedilir, mevcut oturumlar çalışmaya devam eder. Uygulama kısmen veya tamamen erişilemez olur.
3. Teşhis / Diagnosis
psql -U postgres -h <host> -d postgresSELECT usename, application_name, client_addr, state, count(*) AS conns,
max(now() - state_change) AS longest_in_state
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY 1,2,3,4
ORDER BY conns DESC
LIMIT 20;- Çok sayıda `idle` bağlantı: uygulama havuzu şişmiş veya havuz yok, sızıntı var.
- Çok sayıda `idle in transaction`: transaction kapatılmıyor (S1 ile uzun oturumlara bakın).
- Çok sayıda `active`: sunucu yavaşlamış, sorgular birikiyor. Bu bir bağlantı değil performans sorunudur, `pg-slow-queries-triage` runbook'una geçin.
4. Müdahale / Response
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND state_change < now() - interval '10 minutes'
AND pid <> pg_backend_pid()
AND usename NOT IN ('postgres','replicator');ALTER SYSTEM SET idle_in_transaction_session_timeout = '5min';
ALTER SYSTEM SET idle_session_timeout = '15min'; -- PG 14+
SELECT pg_reload_conf();5. **Kalıcı çözüm:** PgBouncer (transaction pooling) ekleyin; uygulama başına havuz boyutunu `(çekirdek × 2) + disk sayısı` civarında tutun.
5. Doğrulama / Verification
- M1 değeri %70'in altına döndü.
- Yeni bağlantılar başarıyla açılıyor, uygulama hataları durdu.
- 15 dakika boyunca tekrar eden doluluk yok.
6. Geri Alma / Rollback
- `pg_terminate_backend` geri alınamaz; etkilenen oturumlar bağlantılarını yeniden kurar.
- Zaman aşımı ayarlarını geri almak için: `ALTER SYSTEM RESET idle_session_timeout;` ardından `pg_reload_conf()`.