MySQL Can't Connect to MySQL Server Hatası Çözümü
MySQL Can't connect hatası servis durması, socket sorunu veya yanlış bind-address nedeniyle oluşur. Adım adım çözüm rehberi.
MySQL Bağlantı Hatası Nedir?
"Can't connect to MySQL server" hatası, MySQL istemcisinin veya uygulamanızın MySQL sunucusuna bağlantı kuramaması durumunda aldığı genel bir hata mesajıdır. Bu hata farklı biçimlerde görünebilir: "Can't connect to MySQL server on 'localhost' (111)", "ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'", "Access denied for user 'root'@'localhost'" veya "ERROR 2003 (HY000): Can't connect to MySQL server on '1.2.3.4' (111)" gibi.
Hata mesajı numaraları önemli ipuçları verir: 111 (Connection refused) servisisin çalışmadığını veya portu dinlemediğini, 2002 (socket hatası) MySQL'in socket dosyasını bulamadığını, 1045 (Access denied) kimlik doğrulama hatasını gösterir. Sorun MySQL servisinin durması, yanlış yapılandırılmış bind-address, bozuk socket dosyası, yetersiz kullanıcı izinleri veya disk doluluk nedeniyle MySQL'in başlayamamasından kaynaklanabilir.
Olası Nedenler
- MySQL/MariaDB servisi çalışmıyor: Sunucu yeniden başlatıldı ancak MySQL otomatik başlamadı.
- Yanlış bind-address: MySQL yalnızca 127.0.0.1'i dinlerken uzak bağlantı deneniyor.
- Socket dosyası bulunamıyor: mysqld.sock dosyası silinmiş veya yanlış konumda.
- Disk alanı doldu: MySQL InnoDB log dosyaları yazılamıyor, servis başlamıyor.
- Yetersiz kullanıcı izinleri: Kullanıcı belirli host'tan bağlanmaya yetkili değil.
- Port 3306 kapalı veya firewall tarafından engelleniyor.
Çözüm Adımları
SSH/Terminal ile MySQL Servisi Kontrolü
İlk adım MySQL servisinin çalışıp çalışmadığını kontrol etmektir.
# MySQL servis durumu
sudo systemctl status mysql # Ubuntu/Debian (MySQL)
sudo systemctl status mariadb # MariaDB
sudo systemctl status mysqld # CentOS/AlmaLinux
# MySQL'i başlat
sudo systemctl start mysql
sudo systemctl enable mysql # Yeniden başlatmada otomatik başlasın
# MySQL başlamazsa log dosyasını incele
sudo tail -50 /var/log/mysql/error.log
sudo journalctl -u mysql -n 50 --no-pager
# Servis başarıyla başladıysa bağlantı testi
mysql -u root -p -e "SELECT 1;"
mysql -u root --socket=/var/run/mysqld/mysqld.sock -e "SELECT 1;"
Socket Dosyası Sorununu Çözme
MySQL socket dosyası bulunamıyorsa veya yanlış konumdaysa hata alınır.
# Socket dosyasının varlığını kontrol et
ls -la /var/run/mysqld/mysqld.sock
ls -la /tmp/mysql.sock
# MySQL konfigürasyonundaki socket yolunu gör
sudo grep socket /etc/mysql/mysql.conf.d/mysqld.cnf
# veya
sudo grep socket /etc/my.cnf
sudo grep socket /etc/mysql/my.cnf
# Socket dizininin izinlerini kontrol et
ls -la /var/run/mysqld/
# Sahip mysql:mysql olmalı
# Dizini yeniden oluştur (gerekirse)
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld
sudo chmod 755 /var/run/mysqld
# MySQL'i yeniden başlat
sudo systemctl restart mysql
bind-address Ayarını Kontrol Etme
Uzak bağlantı için MySQL'in bind-address değerini 0.0.0.0 olarak ayarlayın.
# MySQL konfigürasyon dosyası
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Veya
sudo nano /etc/my.cnf
# Mevcut değer (yalnızca localhost):
# bind-address = 127.0.0.1
# Uzak bağlantıya izin vermek için:
# bind-address = 0.0.0.0
# Veya belirli IP:
# bind-address = 192.168.1.100
sudo systemctl restart mysql
# MySQL'in hangi IP/portu dinlediğini kontrol et
sudo ss -tlnp | grep mysql
sudo netstat -tlnp | grep 3306
Kullanıcı Yetkilerini Kontrol Etme ve Düzeltme
MySQL kullanıcısının belirli host'tan bağlanma yetkisi olmayabilir.
# MySQL root ile gir
sudo mysql -u root
# Kullanıcı ve host listesi
SELECT user, host, authentication_string FROM mysql.user;
# Uzak bağlantı için kullanıcı oluştur veya güncelle
CREATE USER 'kullanici'@'%' IDENTIFIED BY 'guclu_sifre';
GRANT ALL PRIVILEGES ON veritabani_adi.* TO 'kullanici'@'%';
FLUSH PRIVILEGES;
# Belirli IP'den bağlantıya izin ver
CREATE USER 'kullanici'@'192.168.1.50' IDENTIFIED BY 'guclu_sifre';
GRANT ALL PRIVILEGES ON veritabani_adi.* TO 'kullanici'@'192.168.1.50';
FLUSH PRIVILEGES;
# Mevcut kullanıcının yetkilerini gör
SHOW GRANTS FOR 'kullanici'@'localhost';
exit;
Disk Doluluk Sorunu
Disk dolduğunda MySQL InnoDB log dosyalarını yazamaz ve başlamayı reddeder.
# Disk kullanımını kontrol et
df -h
df -h /var/lib/mysql
# MySQL veri dizinini kim kullanıyor?
du -sh /var/lib/mysql/
du -h --max-depth=1 /var/lib/mysql/ | sort -rh | head -10
# Eski binary logları temizle (dikkatli olun!)
sudo mysql -u root -e "SHOW BINARY LOGS;"
sudo mysql -u root -e "PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY);"
# Binary log boyutunu sınırla (my.cnf)
# expire_logs_days = 7
# max_binlog_size = 100M
# tmp dosyalarını temizle
sudo find /tmp -name "*.tmp" -mtime +1 -delete
cPanel Ortamında MySQL Sorunları
cPanel hosting veya VPS'te MySQL bağlantı sorunlarını giderme.
# WHM > SQL Services > MySQL/MariaDB Status
# WHM > SQL Services > phpMyAdmin ile bağlantı testi
# cPanel MySQL veritabanı onarımı
# WHM > SQL Services > Repair a MySQL Database
# SSH ile cPanel MySQL bağlantısı
mysql -u cpanel_kullanici -p veritabani_adi
# MySQL max_connections doldu mu?
sudo mysql -u root -e "SHOW GLOBAL STATUS LIKE 'Max_used_connections';"
sudo mysql -u root -e "SHOW VARIABLES LIKE 'max_connections';"
# max_connections artır (/etc/my.cnf)
# max_connections = 300
Firewall'dan MySQL Portunu Açma
Uzak MySQL bağlantısı için firewall'da 3306 portunu açın (yalnızca güvenilir IP'lere).
# UFW ile belirli IP'ye MySQL portu aç
sudo ufw allow from 192.168.1.50 to any port 3306
# iptables ile
sudo iptables -I INPUT -s 192.168.1.50 -p tcp --dport 3306 -j ACCEPT
# firewalld ile (CentOS/AlmaLinux)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload
# UYARI: MySQL'i internete açmayın! Yalnızca uygulama sunucunuzun IP'sine izin verin.
# Genel kural: 3306 portunu asla 0.0.0.0'a açmayın.
MySQL Şifresini Sıfırlama (Root Erişimi Kaybı)
Root şifresini unuttuysanız güvenli modda sıfırlayabilirsiniz.
# MySQL servisini durdur
sudo systemctl stop mysql
# Güvenli modda başlat (yetki kontrolü olmadan)
sudo mysqld_safe --skip-grant-tables &
# Bağlan ve şifreyi sıfırla
mysql -u root
# MySQL 5.7+
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yeni_guclu_sifre';
FLUSH PRIVILEGES;
# MySQL 8.0+
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yeni_sifre';
FLUSH PRIVILEGES;
exit;
# Normal modda yeniden başlat
sudo systemctl restart mysql
Özet ve Önleyici Tedbirler
- MySQL servisine systemd otomatik yeniden başlatma ekleyin:
Restart=on-failure. - Binary logları düzenli temizleyin; expire_logs_days değerini ayarlayın.
- Disk doluluk uyarıları kurun; /var/lib/mysql dizinini izleyin.
- MySQL kullanıcılarına yalnızca ihtiyaç duydukları veritabanı ve host için izin verin.
- MySQL portunu (3306) asla genel internete açmayın; VPN veya SSH tüneli kullanın.
- MySQL konfigürasyon değişikliklerini test ortamında önce deneyin; yedek alın.
İlgili Makaleler
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!