MySQL “Too many connections” Hatası: Net Çözüm Rehberi
MySQL “Too many connections” hatasını tetikleyen nedenleri, bağlantı limitlerini ve uygulama/ayar optimizasyonlarını adım adım öğrenin.
MySQL’de görülen "Too many connections" hatası, uygulamanızın veritabanı katmanında tıkanma yaşadığını gösterir. Bu durum sadece bir rahatsızlık değil; doğru yönetilmediğinde performans düşüşü, zaman aşımı (timeout) ve hizmet kesintisiyle sonuçlanır. Bu rehberde, hatanın nereden geldiğini (MySQL ayarları, uygulama bağlantı davranışı, kaynak limitleri) net şekilde ayırt edip çözüm yollarını sıralayacağız. Ayrıca pratikte uygulanacak ayar önerileri ve test yaklaşımı da vereceğiz.
1) Hatanın kökü: Bağlantı limitine neden ulaşılıyor?
"Too many connections" mesajı, MySQL’in yeni bağlantıları kabul edecek kapasiteyi kalmadığında çıkar. Sorunun kaynağı çoğu zaman üç başlıkta toplanır:
- MySQL bağlantı limitine ulaşılıyor:
max_connectionsayarı doluyor. - Bağlantılar serbest bırakılmıyor: Uygulama connection’ları kapatmıyor ya da havuz (pool) kullanmıyor.
- Bağlantılar uzun sürüyor: Yoğun sorgular, kilit (lock) beklemeleri veya yavaş query’ler nedeniyle bağlantılar “aktif” kalıyor.
Hızlı teşhis: Gerçek limit ve mevcut bağlantılar
Önce şu bilgileri kontrol edin:
- MySQL’in izin verdiği maksimum bağlantı:
max_connections - Anlık bağlantı sayısı:
Threads_connected - Bekleyen bağlantılar:
Threads_connected+ bağlantı kuyruğu (varsa) - Bağlantıların hangi durumda takıldığı:
Threads_running
MySQL içinde şu sorgular genellikle yol gösterir:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Threads_running';
Bu değerler arasında “yakın ilişki” şu şekilde okunur:
- Threads_connected ≈ max_connections ise, doğrudan limit dolmuştur.
- Threads_connected yüksek ama Threads_running düşükse, bağlantılar “bekleme” durumunda kalıyor olabilir.
- Threads_running yüksekse, bağlantılar yoğun sorgularla meşgul demektir.
2) Kısa vadeli müdahale mi, köklü çözüm mü?
“Bağlantı limitini artırmak” çoğu zaman ilk refleks olur. Ancak bu, sorunun kaynağı olan bağlantı yönetimini düzeltmez; sadece tıkanıklığın daha geç yaşanmasına neden olur. En sağlıklı yaklaşım şudur:
- Sorunun kapsamını ölç: Kaç bağlantı geliyor, pik saatlerde nasıl değişiyor?
- Bağlantıların davranışını düzelt: Uygulamada havuz kullanımı ve connection kapanışı.
- Sorgu ve kilit problemlerini çöz: Yavaş query + lock beklemeleri.
- Gerekirse MySQL tarafında limitleri ayarla: Uygun aralıkla, RAM/CPU/IO kapasitesine göre.
Aşağıdaki tablo, hangi senaryoda hangi yaklaşımın daha doğru olduğuna net bir çerçeve çizer:
| İşaret (gözlem) | Muhtemel neden | En doğru ilk adım | Limit artırma uygun mu? |
|---|---|---|---|
Threads_connected hemen max_connections’a çöküyor |
Bağlantı sızıntısı veya havuz yok | Uygulama connection yönetimini düzelt | Sadece geçici |
| Pik saatlerde artıyor ama düşmüyor | Query/lock nedeniyle bağlantılar serbest kalmıyor | Yavaş query + lock analizi | Dikkatli |
Threads_running yüksek |
CPU/IO yoğun sorgular | Query optimizasyonu | Geçici sayılabilir |
| Hata sadece belirli endpoint’te | O endpoint’te bağlantı davranışı farklı | O kod yolunu incele | Nadir |
3) Uygulama katmanı: Connection pooling ve doğru kapatma
MySQL’e bağlantı aç-kapat yaklaşımı, trafik arttığında hızlıca bağlantı fırtınasına dönüşür. Bu sorunu en çok çözen unsur genellikle connection pooling (bağlantı havuzu) olur.
Connection pool kullanmama neden bu hatayı hızlandırır?
- Her istek yeni connection açar.
- Aynı anda çok istek geldiğinde bağlantılar çoğalır.
- MySQL, bu bağlantılar için thread/worker ayırır; kaynaklar tükenir.
Net kontrol listesi
Uygulama tarafında şu maddeler “standart” olmalıdır:
- Uygulama connection pool kullanır (ör. Java HikariCP, Node.js için pool kütüphaneleri, PHP PDO + pool mimarisi).
- Connection açıldıktan sonra her yol için düzgün kapatılır.
- Timeout’lar (hem uygulama hem DB) makul seviyededir.
- Çok uzun süren sorgular için limit/indeks stratejisi vardır.
Havuz büyüklüğünü (pool size) doğru seçmek
Havuz boyutunu rastgele büyütmek de sorunu yerinden eder. Net yaklaşım:
- MySQL tarafında
max_connectionsartıyorsa, uygulama aynı hızda artan bağlantıları “üretebilir”. - Bu yüzden pool boyutu; uygulamanın beklenen eşzamanlılık (concurrency) ihtiyacına göre belirlenir.
Genel kural olarak: - Bir uygulama instance’ı için pool boyutu, instance başına beklenen eşzamanlı istekle uyumlu olmalıdır. - Çoklu instance (ör. 4 pod) varsa toplamı düşünmek gerekir.
Örnek hesap (yaklaşık): - 4 uygulama instance - instance başına pool size 20 - toplam hedef bağlantı ≈ 80
Bu toplam, MySQL’in max_connections değerinin ve diğer kullanıcı/servislerin ihtiyacının altında kalmalıdır.
4) MySQL ayarları: max_connections ve eş zamanlılık gerçeği
Bağlantı limitini artırmak kısa vadede hata yüzdesini düşürebilir; ancak bu kararın bedeli vardır: max_connections büyüdükçe MySQL’in yönetmesi gereken thread sayısı artabilir ve RAM/CPU baskısı yükselir.
max_connections nasıl okunur?
max_connections: Aynı anda kabul edilebilecek maksimum bağlantı.- Bu ayarı artırırken MySQL’in çalıştığı sunucudaki RAM ve CPU kapasitesi kritik rol oynar.
Pratikte hedef: - “Hata vermeden” çalışabilecek bir kapasiteye ulaşmak - Aynı zamanda sunucuyu thread/konuşturma maliyetleriyle yormamak
İyileştirme yaklaşımı
- Önce mevcut
max_connectionsve gerçek bağlantı davranışını ölçün. max_connectionsartıracaksanız, tek seferde aşırı yükseltmeyin.- Paralel olarak sorgu optimizasyonu ve connection pooling’i düzeltin.
5) Yavaş sorgular ve kilitler: Bağlantı sayısı değil süre sorunu
Bağlantı limitini dolduran sadece “kaç bağlantı geldiği” değil; bağlantıların ne kadar süreyle meşgul kaldığıdır. Yavaş sorgu veya lock beklemeleri bağlantıları “aktif” tutar ve sonuçta Threads_running artar.
Ne bakmalı?
- En uzun süren sorgular (slow query log veya APM)
- Sık tekrar eden aynı sorgular
- Lock beklemeleri (transaction davranışları)
- İndeks eksikliği
Net test yöntemi
- Trafik pikine yakın bir zamanda, yavaş query listesini çıkarın.
- Her bir sorgu için EXPLAIN planına bakın.
- Eksik indeks varsa doğru indeksleri ekleyin.
Örnek indeks kontrol mantığı:
- WHERE şartlarında kullanılan kolonlar indekslenmiş mi?
- JOIN yapılan alanlar indeksli mi?
- Sıralama (ORDER BY) ve filtreleme kolonları birlikte çalışıyor mu?
İndeks eklemek genellikle bağlantı sayısını doğrudan azaltmaz; ancak sorgu süresini kısalttığı için bağlantıların daha erken kapanmasını sağlayarak toplam bağlantı baskısını düşürür.
6) Doğru barındırma seçimi: Sunucu kaynakları bağlantı kapasitesini belirler
Bu hatayı sadece yazılımsal ayarlarla çözmek her zaman mümkün olmayabilir. MySQL’in çalıştığı sunucunun disk ve CPU performansı özellikle sorgu süresini etkiler; sorgu uzadıkça bağlantı süresi uzar ve bağlantı limiti daha çabuk dolabilir.
VM/VDS tarafında dikkat edilmesi gerekenler
- RAM:
max_connectionsartınca daha fazla thread kaynak tüketecektir. - CPU: CPU-bound sorgular thread sayısıyla birleşince hızla tıkanma yaratır.
- Disk (IOPS/latency): Yüksek gecikme, sorgu süresini uzatır.
Bu nedenle bağlantı yönetimini düzeltirken, sunucu tarafında şu kontrol yapılmalıdır: - Disk performansı kararlı mı? (özellikle yoğun IO anlarında) - CPU kullanım piki bağlantı hatasıyla aynı zamana mı denk geliyor? - RAM kullanımı sabit mi yoksa sürekli artış eğiliminde mi?
7) Adım adım uygulama planı (kesin sıralama)
Aşağıdaki plan, “hangi veriyi toplarım → neyi değiştiririm → nasıl doğrularım” şeklinde ilerler.
Adım 1: Veri topla (15-30 dk)
max_connectionsThreads_connected,Threads_running- Uygulama tarafında concurrent istek sayısı (istek başına DB işlem sayısı)
- Hatanın saat aralığı ve hangi endpoint’te yoğunlaştığı
Adım 2: Connection pooling ve kapanış hatalarını düzelt (1-4 saat)
- Pool kullanmayan katmanları tespit et
- Connection’ların her koşulda kapandığından emin ol
- Endpoint başına DB çağrı sayısını ölç
Adım 3: Yavaş sorguları indir (yarım gün – 2 gün)
- Slow query log veya APM üzerinden en pahalı sorguları bul
- EXPLAIN ile indeks/plan sorunlarını gider
- Kilit (lock) beklemelerini minimize edecek transaction tasarımını gözden geçir
Adım 4: MySQL limitlerini kontrollü ayarla (30-60 dk)
max_connectionsartışı yapacaksanız; RAM ve CPU sınırlarına göre sınırlı bir değer seçin.- Artışı tek başına çözüm gibi görmeyin; çünkü kök neden düzeltilmezse bağlantı yine dolar.
Adım 5: Doğrula (pik testi)
- Uygulama pik yükünü simüle et
- Hata tekrar ediyor mu?
Threads_connectedtepe yapıyor mu yoksa daha erken normal seviyeye mi dönüyor?
8) Ne zaman “büyütme” (scale-up) veya “bölme” gerekir?
Aşağıdaki şartlarda ölçekleme kararı netleşir:
- Tek bir uygulama instance’ı bile pool boyutuna rağmen bağlantı hızla doluyorsa: kod/DB davranışı sorunu vardır (ölçekleme değil önce düzeltme).
- Bağlantılar kısa ama çok fazla: kullanıcı trafiği ve concurrency gerçek olarak yüksek olabilir; burada doğru havuz boyutu ve doğru sunucu kapasitesi gerekir.
- Sorgular optimize edilemiyor ve yük sürekli: read replica (okuma replikası) veya daha güçlü MySQL kaynak planlaması gündeme gelir.
Sonuç: Bağlantı sızıntısını ve süreyi birlikte düzeltin
"Too many connections" hatasını kalıcı çözümleyecek yaklaşım tek bir ayarı büyütmek değil; bağlantının nasıl açıldığını (pool/kapatma), bağlantının ne kadar süreyle tutulduğunu (yavaş query/lock) ve sunucunun kaynak kapasitesini birlikte yönetmektir. Bugün yapabileceğiniz en net aksiyon: Önce max_connections, Threads_connected ve Threads_running verilerini toplayın; ardından uygulama tarafında connection pool ve kapanış kontrolünü uygulayın; yavaş sorguları azaltıp MySQL limitini kontrollü gözden geçirin.
İsterseniz kullandığınız uygulama dili/çerçevesini ve MySQL’deki mevcut max_connections değerini yazın; buna göre pool boyutu ve ayar aralığını daha net bir planla önerebilirim.
Hosting karşılaştırması yapmaya hazır mısın?
100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.
Hosting Karşılaştır →İlgili Yazılar
WordPress Eklentileri Sunucuyu Yavaşlatıyorsa Net Teşhis Rehberi
WordPress eklentileri sunucuyu yavaşlatıyorsa; etkili teşhis, eklenti etki ölçümü, veritabanı izleme ve kalıcı hız iyileştirme adımlarını öğrenin.
Site Geçici Kapanınca SEO İçin Doğru 503 Kodu Nasıl Kullanılır?
Siteyi geçici kapattığınızda SEO’nun etkilenmemesi için doğru 503 yanıtını, Retry-After ve yönlendirmeyi net örneklerle öğrenin.
Game Server İçin VDS Seçerken 9 Kriter (Net Karşılaştırma)
Game server için VDS seçerken gecikme, CPU, bant genişliği, disk ve yedekleme gibi 9 kritere göre net kontrol listesi ve karşılaştırma.
Browser Cache Nasıl Yapılandırılır? Chrome/Firefox Adım Adım
Browser cache’i doğru ayarla: HTTP header (Cache-Control, ETag) ve tarayıcı ayarlarıyla sayfa hızını artır, gereksiz güncellemeleri azalt.