dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-too-many-connections-for-role
PostgreSQL
PG 14 - 17Bağlantı & Havuz
5 dk okuma
FATAL: too many connections for role "app_user"

PostgreSQL Rol Bağlantı Limiti Aşımı: Nedenleri, Acil Limit Artırımı ve Rol Bazlı Havuzlama

ALTER ROLE ... CONNECTION LIMIT kısıtlamasının uygulama pod artışıyla dolması, acil limit düzenleme ve PgBouncer kullanıcı bazlı havuz mimarisi.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: PostgreSQL 14 / 15 / 16 / 17

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 2 Kasım 2026
Test Edilen SürümlerPostgreSQL 14.10, 15.6, 16.4, 17.11 (Ubuntu 24.04)
Gerekli YetkiSUPERUSER veya CREATEROLE
Risk Seviyesi
MediumCONNECTION LIMIT değerini -1 (sınırsız) yapmak kümenin max_connections sınırını tüketebilir
Beklenen ÇıktıRol bağlantı sayısının CONNECTION LIMIT değerinin altına inmesi
Geri Dönüş (Rollback) Planı:ALTER ROLE app_user CONNECTION LIMIT 50;
PostgreSQL Docs: ALTER ROLE Connection Limits
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

Belirli bir mikroservis bağlantı kurmaya çalıştığında reddedilirken diğer servisler sorunsuz çalışır:

plaintext
FATAL: too many connections for role "app_user"

▸Sahada Ne Görürsün?

Süper kullanıcı ve diğer roller bağlanabilir. Ancak app_user kullanan pod'lar bağlantı havuzu zaman aşımına (HikariPool - Connection is not available) uğrar.


▸Kök Neden Matrisi

OlasılıkKök NedenAçıklama
%65Uygulama Pod ÖlçeklenmesiCONNECTION LIMIT 20 belirlenmiştir. Pod sayısı 2'den 6'ya çıkınca kota anında patlar.
%25Bağlantı Sızıntısı (Connection Leak)Uygulama idle oturumları kapatmamış, kotayı doldurmuştur.
%10Katı Limit PolitikasıDBA limiti trafik artışına göre güncellenmemiştir.

▸ACİL RUNBOOK (0-5dk)

sql
-- 1. Rol limitini ve mevcut oturumları gör SELECT rolname, rolconnlimit FROM pg_roles WHERE rolname = 'app_user'; SELECT count(*), state FROM pg_stat_activity WHERE usename = 'app_user' GROUP BY state; -- 2. Acil kotayı geçici kaldır (-1 = sınırsız) ALTER ROLE app_user CONNECTION LIMIT -1; -- 3. Boştaki oturumları sonlandır SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'app_user' AND state = 'idle' AND state_change < now() - interval '5 minutes';

▸KALICI BLUEPRINT

  1. 1PgBouncer Havuzlama: İstemciler doğrudan değil PgBouncer üzerinden bağlanmalıdır.
  2. 2Rol Limiti: Pod Sayısı x Havuz x 1.2 formülü uygulanmalıdır:
sql
ALTER ROLE app_user CONNECTION LIMIT 60;
  1. 1Oturum Zaman Aşımları: ALTER ROLE app_user SET idle_in_transaction_session_timeout = '1min';

▸Doğrulama

sql
SELECT r.rolname, r.rolconnlimit, count(s.pid) AS active_connections FROM pg_roles r LEFT JOIN pg_stat_activity s ON r.rolname = s.usename WHERE r.rolname = 'app_user' GROUP BY r.rolname, r.rolconnlimit;

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (82)