dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #13
mysql
AvailabilitySEV1 · KRİTİK KESİNTİ15-30 dakika / 15-30 minsSUPER / CONNECTION_ADMIN / RELOAD / REPLICATION CLIENT

MySQL 'Too many connections' (Error 1040) Hatası: Teşhis ve Çözüm

Bağlantı sınırı dolduğunda sunucuya girip yer açma, sorumlu istemciyi bulma ve max_connections ayarını güvenle değiştirme adımlarını verir.

İlişkili Metrik:M13M14
İlişkili Script:S28S21
#connections#max_connections#error-1040#incident

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.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Belirti / Symptom

- `ERROR 1040 (HY000): Too many connections`.

- M13 %90 üzeri; `Threads_connected` ≈ `max_connections`.

2. Etki / Impact

Yeni istemciler bağlanamaz; uygulama hata verir. Mevcut bağlantılar sürer.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. Yönetici bağlantısı ile girin. `CONNECTION_ADMIN` (8.0) veya `SUPER` yetkili hesap `max_connections`'a ek **bir** bağlantı açabilir:
bash
mysql -u admin_user -p

Not: Yetkili hesabı uygulamanın kullanmadığından emin olun, aksi halde bu slot da dolar.

🟢 Salt Okunur2. Dağılıma bakın (S28):
sql
SELECT user, SUBSTRING_INDEX(host,':',1) AS client_host, command, COUNT(*) AS sessions
FROM information_schema.processlist
GROUP BY user, client_host, command
ORDER BY sessions DESC LIMIT 20;
🟢 Salt Okunur3. Yorumlayın:

- Çoğunlukla `Sleep`: bağlantı sızıntısı veya aşırı büyük havuz.

- Çoğunlukla `Query` ve uzun süreli: sunucu yavaşladı, sorgular birikiyor. Bağlantı sorunu değil performans sorunudur (S21 ile uzun sorgulara bakın, `mysql-high-cpu-threads-running` senaryosuna geçin).

🟢 Salt Okunur4. `SHOW GLOBAL STATUS LIKE 'Max_used_connections';` ile pik değeri ve `Aborted_connects` ile başarısız denemeleri kontrol edin.

4. Müdahale / Response

🟡 Geri Alınabilir1. Boşta kalan eski bağlantıları sonlandırın:
sql
SELECT CONCAT('KILL ', id, ';') AS cmd
FROM information_schema.processlist
WHERE command = 'Sleep' AND time > 300 AND user NOT IN ('system user','repl');

Çıktıdaki komutları gözden geçirip çalıştırın.

🟡 Geri Alınabilir2. `max_connections` değerini **yeniden başlatmadan** geçici artırın:
sql
SET GLOBAL max_connections = 600;
-- 8.0: kalıcı olması için
SET PERSIST max_connections = 600;

**Dikkat:** Her bağlantı thread buffer'ları (sort, join, read buffer) kadar bellek kullanabilir. Artırmadan önce bellek payını kontrol edin: `~ max_connections × (thread buffer toplamı)` fiziksel RAM'e sığmalı, aksi halde OOM kill riski vardır.

🟡 Geri Alınabilir3. Boşta bağlantıları otomatik kapatın:
sql
SET GLOBAL wait_timeout = 600;
SET GLOBAL interactive_timeout = 600;

4. **Kalıcı çözüm:** Uygulamada bağlantı havuzu boyutunu sınırlayın (uygulama sayısı × havuz boyutu < `max_connections`), ProxySQL gibi bir proxy ile bağlantı çoklayın.

5. Doğrulama / Verification

- Uygulamadan yeni bağlantılar başarıyla açılıyor, M13 %70'in altında.

- `Threads_connected` stabil, `Aborted_connects` artmıyor.

- `my.cnf` içinde kalıcı değer yazıldı veya `SET PERSIST` kullanıldı.

6. Geri Alma / Rollback

- `KILL` geri alınamaz.

- `SET GLOBAL max_connections = <eski_deger>;` ile eski değere dönün. `SET PERSIST` yapıldıysa `RESET PERSIST max_connections;`.

Diğer MYSQL Runbook'ları