sunucuhataları
teknik çözüm merkezi
Ara Giriş Yap Üye Ol
🏠 Ana Sayfa 📚 Kurulum Rehberleri
Kategoriler
🌐 Web Sunucuları 🐧 İşletim Sistemleri 📦 Sanallaştırma & VPS 🖥️ Kontrol Panelleri 🔒 SSL & Güvenlik 📝 CMS & Uygulamalar 🗄️ Veritabanı 📧 Mail Sunucusu 🗨️ Forum ℹ️ Hakkımızda 📧 İletişim
Giriş Yap Üye Ol
Ana Sayfa Veritabanı MySQL Can't Connect to MySQL Server Hatası Çözümü
🗄️ Veritabanı

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.

📅 10 Ocak 2025 👁 38 görüntülenme ⏱ 6 dk okuma
𝕏 Paylaş
📋 İçindekiler göster/gizle

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

🤔 Bu kurulumda sorun mu yaşıyorsunuz?

Hata mesajınızı kopyalayıp foruma konu açın. Topluluğumuz size özel durumunuza göre yardımcı olacaktır.

🗨️ Foruma Katıl & Yardım Al
Etiketler: #cpanel #linux #php #mysql

Yorumlar

Henüz yorum yok. İlk yorumu siz yapın!

Yorum Yap

Yorumunuz onaylandıktan sonra yayınlanır.