dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #13
mysql
AvailabilitySEV1 · CRITICAL OUTAGE15-30 dakika / 15-30 minsSUPER / CONNECTION_ADMIN / RELOAD / REPLICATION CLIENT

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.

Related Metrics:M13M14
Related Scripts:S28S21
#connections#max_connections#error-1040#incident

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.

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

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

🟢 Read-Only1. 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.

🟢 Read-Only2. 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;
🟢 Read-Only3. 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).

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

4. Remediation & Action Plan

🟡 Reversible1. 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.

🟡 Reversible2. `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.

🟡 Reversible3. 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. 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;`.

More MYSQL Runbooks