MySQL 'Too many connections' (Error 1040): Diagnosis and Fix
Covers getting into a saturated server, freeing slots, finding the responsible client and changing max_connections safely.
Operational Safety & Risk Notice
This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.
1. Symptom & Signals
- `ERROR 1040 (HY000): Too many connections`.
- M13 %90 üzeri; `Threads_connected` ≈ `max_connections`.
2. Business & Technical Impact
Yeni istemciler bağlanamaz; uygulama hata verir. Mevcut bağlantılar sürer.
3. Diagnosis & Root-Cause Analysis
mysql -u admin_user -pNot: Yetkili hesabı uygulamanın kullanmadığından emin olun, aksi halde bu slot da dolar.
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;- Ç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).
4. Remediation & Action Plan
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.
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.
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. Verification & Health Checks
- 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. Rollback & Contingency Plan
- `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;`.