dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-remaining-connection-slots
PostgreSQL
PG 13 - 17Bağlantı & Havuz
5 dk okuma
FATAL: remaining connection slots are reserved for non-replication superuser connections

PostgreSQL "remaining connection slots are reserved" — Bu, Bağlantı Sınırının Son Uyarısı

"remaining connection slots are reserved" hatasının max_connections ile ilişkisi, süper kullanıcı kurtarma penceresi ve bağlantıyı tüketen uygulamayı bulma yöntemi.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: PostgreSQL 13 / 14 / 15 / 16 / 17
İ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

plaintext
FATAL: remaining connection slots are reserved for non-replication superuser connections

Bu mesaj, too many clients already hatasından bir adım öncedir ve aradaki fark kritiktir. Burada superuser_reserved_connections (varsayılan 3) kadar slot hâlâ boştur — yani süper kullanıcı olarak veritabanına hâlâ bağlanabilirsiniz. Bu, size verilmiş kurtarma penceresidir. O pencereyi kullanmazsanız bir sonraki aşama, kimsenin bağlanamadığı tam kesintidir.


▸Adım adım acil müdahale

1. Kurtarma penceresini kullanın. Süper kullanıcı ile bağlanıp durumu görün:

sql
SELECT count(*) AS toplam, current_setting('max_connections')::int - current_setting('superuser_reserved_connections')::int AS kullanilabilir FROM pg_stat_activity;

2. Kim tüketiyor?

sql
SELECT usename, application_name, state, count(*), max(now() - state_change) AS en_uzun_sure FROM pg_stat_activity GROUP BY 1, 2, 3 ORDER BY 4 DESC;

application_name sütunu boş (NULL veya boş string) ise bağlantı kaynağını bulmak için IP bazlı dağılıma bakın:

sql
SELECT client_addr, count(*) FROM pg_stat_activity GROUP BY 1 ORDER BY 2 DESC;

3. Boşta olanları sonlandırın, aktif olanlara dokunmayın.

sql
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND pid <> pg_backend_pid();

active oturumları sonlandırmayın; yarıda kalan bir işlem veri tutarsızlığı riski yaratabilir. idle in transaction oturumları ise öncelikli hedeftir — hem slot tutar hem kilit tutarlar.

4. Rol bazlı bağlantı sınırı koyun. Tek bir servis veya uygulamanın tüm kapasiteyi yemesini engellemenin en hızlı yolu:

sql
SELECT rolname, rolconnlimit FROM pg_roles WHERE rolconnlimit <> -1; ALTER ROLE uygulama_kullanici CONNECTION LIMIT 40;

5. Kalıcı çözüm. max_connections'ı rastgele yükseltmek yanlış reflekstir: her bağlantı 5–10 MB bellek tüketir. Doğru sıra: uygulama havuzunu küçült → PgBouncer (transaction modu) → oturum zaman aşımları:

sql
ALTER SYSTEM SET idle_session_timeout = '10min'; ALTER SYSTEM SET idle_in_transaction_session_timeout = '60s'; SELECT pg_reload_conf();

6. İzleme ajanlarını kontrol edin. Bu hatanın sinsi bir nedeni, her veritabanına ayrı bağlanan izleme araçlarıdır: 30 veritabanı × 2 bağlantı = 60 slot. İzleme aracınızın bağlantı havuzunu sınırlandırın.


▸Bunu bir daha yaşamamak için

Bağlantı sayısını max_connections'ın %70'i seviyesinde alarm eşiği yapın. Bağlantı sayısı ile işlem sayısını (xact_commit) birlikte izleyin: bağlantı artarken işlem sayısı sabitse sorun havuzsuz mimaridir.

Diğer Veritabanı Hata Teşhisleri

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

Tüm Hatalar (20)