dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/mysql-2002-cant-connect-socket
MySQL
MySQL 5.7–8.4 LTSBağlantı & Ağ
9 dk okuma
ERROR 2002 (HY000): Can't connect to local MySQL server through socket

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ı.

İnceleyen:Principal Database Reliability Architect
Test Edilen Sürümler: MySQL 8.4 LTS, 8.0.40 & 5.7.44 (Debian / Ubuntu / Docker 29.7)

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 30 Ekim 2026
Test Edilen SürümlerMySQL 8.4 LTS & 8.0.40 (Docker 29.7, Ubuntu 24.04 LTS) | Tarihsel: 5.7
Gerekli YetkiRoot / sudo OS erişimi (systemctl, socket izinleri ve dosya sistemini kontrol etmek için)
Risk Seviyesi
Highmysqld başlatılamadığında PID veya soket dosyasını körlemesine silmek çalışan bir instance'ın verisini bozabilir
Beklenen ÇıktıErrno ayrımına göre (2 ENOENT, 111 ECONNREFUSED, 13 EACCES, 28 ENOSPC) soket yolunun veya TCP bağlantısının onarılması
Geri Dönüş (Rollback) Planı:my_print_defaults ile soket yolunu normalize etme, disk alanını boşaltma ve 127.0.0.1 TCP fallback kullanımı
MySQL 8.4 Docs: Troubleshooting Connection to MySQL Server
İlk 60 Saniye Teşhis Protokolü:

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

plaintext
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 mysqld servisi ç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: mysqld aniden çökmüş ve geride bayat (stale) bir .sock dosyası 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?

bash
systemctl status mysql --no-pager # veya ps aux | grep mysqld

2. Soket Dosyası Nerede ve Kim Dinliyor?

bash
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:

bash
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:

plaintext
[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:

bash
tail -n 100 /var/log/mysql/error.log

En 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

ini
[mysqld] socket=/var/run/mysqld/mysqld.sock [client] socket=/var/run/mysqld/mysqld.sock

Dizin izinlerini düzeltin:

bash
mkdir -p /var/run/mysqld chown -R mysql:mysql /var/run/mysqld chmod 755 /var/run/mysqld

4. TCP Ağının Açık Olduğunu Doğrulayın

sql
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ı

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)