MySQL Error 2002 — Sunucu mu Kapalı, Soket mi Yanlış?
2002 hatasında errno koduyla dört nedeni ayırma: soket yolu uyuşmazlığı, mysqld'nin çalışmaması, izinler ve Docker. localhost ile 127.0.0.1 farkı.
Operasyonel Doğrulama & Güvenilirlik Standardı
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
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (13)Bu hatanın PostgreSQL karşılığı H-07'de (connection refused) incelenmişti. MySQL'de soket üzerinden yerel bağlantı kurulurken patlayan bu hatanın tüm teşhis sırrı parantez içindeki işletim sistemi errno numarasında gizlidir:
- •(2) ENOENT — No such file or directory: Belirtilen yolda soket dosyası fiziksel olarak yoktur. Ya
mysqldservisi çalışmıyordur ya da istemci yanlış dizine bakıyordur. - •(111) ECONNREFUSED — Connection refused: Soket dosyası dosya sisteminde mevcuttur; ancak arkasında dinleme yapan hiçbir süreç yoktur. Tipik senaryo:
mysqldaniden çökmüş ve geride bayat (stale) bir.sockdosyası bırakmıştır. - •(13) EACCES — Permission denied: Soket dosyası vardır ancak bağlanan işletim sistemi kullanıcısının dizine girme veya dosyayı okuma/yazma izni yoktur. Alternatif olarak AppArmor veya SELinux profili süreci engelliyordur.
▸Kritik Ayrım: `localhost` ≠ `127.0.0.1`
MySQL istemci kütüphanelerinde (C connector, PHP PDO, Node.js mysql2, Python mysqlclient):
- •`localhost` yazıldığında istemci TCP ağını kullanmaz; UNIX domain soketini kullanmaya zorlar.
- •`127.0.0.1` yazıldığında ise yerel TCP geri döngü (loopback) adaptörü üzerinden 3306 portuna bağlanır.
Bu yüzden şu senaryo binlerce mühendisin kafasını karıştırır:
- •
mysql -h 127.0.0.1 -P 3306 -u root -p→ Sorunsuz çalışıyor! - •
mysql -h localhost -u root -p→ ERROR 2002!
Eğer 127.0.0.1 ile bağlanabiliyorsanız, MySQL sunucusu ayaktadır ve sorun kesinlikle soket yolu uyuşmazlığından ibarettir!
▸Adım Adım Teşhis Akışı
1. MySQL Servisi Gerçekten Çalışıyor mu?
systemctl status mysql --no-pager
# veya
ps aux | grep mysqld2. Soket Dosyası Nerede ve Kim Dinliyor?
ss -lnp | grep -E '3306|.sock'
ls -la /var/run/mysqld/Dosya varsa ama ss çıktısında soketi dinleyen bir süreç görünmüyorsa errno (111) alırsınız. Bu durumda bayat soket dosyasını silip servisi temiz başlatmak gerekir.
3. Sunucu ile İstemcinin Baktığı Yolları Karşılaştırın
Bağlantı kurulamadığı için SHOW VARIABLES çalıştıramazsınız. MySQL'in diskteki derlenmiş varsayılanlarını okuyun:
my_print_defaults mysqld | grep -E 'socket|port|bind'
my_print_defaults client | grep 'socket'Sunucu /var/run/mysqld/mysqld.sock oluşturuyor, istemci ise /tmp/mysql.sock arıyorsa iki taraf farklı dünyalardadır. Ubuntu/Debian ile RedHat/CentOS arasındaki en yaygın paketleme farkı budur.
4. Disk Doluluğu Tuzağı (Errcode: 28)
MySQL başlatılırken diskte yer kalmadıysa soket veya PID dosyasını oluşturamaz ve servis anında düşer:
[ERROR] Can't create/write to file '/var/run/mysqld/mysqld.sock' (Errcode: 28 - No space left on device)df -h ile özellikle /var ve /tmp bölümlerini kontrol edin.
5. Docker ve Container Ayrımı
Docker container içinde çalışan MySQL'in soketi container'ın izole dosya sistemindedir. Host makineden soketle bağlanabilmek için dizinin volume olarak bağlanması (-v /var/run/mysqld:/var/run/mysqld) gerekir. Ayrıca container içindeki bir uygulama için localhost host makineyi değil container'ın kendisini temsil eder.
▸Adım Adım Kalıcı Çözüm
1. Hata Logunu İnceleyerek Servisi Başlatın
Körlemesine systemctl restart mysql yapmayın; çöküş nedenini logdan okuyun:
tail -n 100 /var/log/mysql/error.logEn sık iki çöküş nedeni: Linux OOM-Killer (RAM yetersizliği) ve Disk Doluluğu (Errcode 28).
2. İstemci Bağlantılarını TCP Loopback'e Standardize Edin
Uygulama yapılandırmalarındaki DB_HOST=localhost tanımını DB_HOST=127.0.0.1 olarak değiştirin. Bu tek değişiklik soket yolu uyumsuzluklarını kalıcı olarak bertaraf eder.
3. Soket Yolunu my.cnf İçinde Eşitleyin
[mysqld]
socket=/var/run/mysqld/mysqld.sock
[client]
socket=/var/run/mysqld/mysqld.sockDizin izinlerini düzeltin:
mkdir -p /var/run/mysqld
chown -R mysql:mysql /var/run/mysqld
chmod 755 /var/run/mysqld4. TCP Ağının Açık Olduğunu Doğrulayın
SHOW VARIABLES LIKE 'skip_networking';
SHOW VARIABLES LIKE 'bind_address';Eğer skip_networking = ON ise MySQL TCP üzerinden bağlantı kabul etmez, yalnızca yerel soketi dinler.
▸İlgili Hata Rehberleri & Hub Bağlantıları
- •PostgreSQL Connection Refused (H-07) — PostgreSQL bağlantı reddi karşılığı
- •MySQL Too Many Connections (H-32) — Bağlantı havuzu tükenmesi
- •MySQL No Space Left on Device (H-17) — Disk doluluğu ve Errcode 28
- •MySQL Hub — MySQL mimarisi ve altyapı yönetimi
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.
MySQL Deadlock ERROR 1213: Grafiği Okuma ve Kalıcı Önleme
MySQL 1213 deadlock hatasının nedeni, LATEST DETECTED DEADLOCK çıktısını okuma, gap lock kaynaklı kilitlenmeler ve uygulama tarafında retry tasarımı.
MySQL Lock wait timeout exceeded: Bloklayan İşlemi Bulma
1205 lock wait timeout hatasında bloklayan işlemi performance_schema ile bulma, KILL kararını verme ve kilidi kalıcı olarak azaltma yöntemleri.