MySQL/MariaDB'ye uzaktan bağlanma ve "Too many connections" hatası
Aynı sunucuda çalışan uygulama veritabanına localhost ile bağlanır; sorun yoktur. Ama bilgisayarınızdan bir yönetim aracıyla ya da başka bir sunucudaki uygulamadan bağlanmak istediğinizde iki sık hata çıkar: bağlantının hiç kurulmaması ve "Too many connections". Bu rehber ikisini ele alır. Temel kurulum için önce MySQL ve MariaDB kurulumu makalesine bakın.
Uzaktan bağlanma: üç katman
Uzaktan bağlantının çalışması için üç şey aynı anda doğru olmalı. Bir tanesi bile yanlışsa hata alırsınız.
1. Veritabanı dışarıdan dinliyor mu?
Varsayılan olarak MySQL/MariaDB yalnızca 127.0.0.1 adresini dinler. Ayar dosyasında (/etc/mysql/mariadb.conf.d/50-server.cnf ya da /etc/mysql/mysql.conf.d/mysqld.cnf) bind-address satırına bakın:
bind-address = 127.0.0.1
Başka sunucudan bağlanılacaksa sunucunun özel ya da genel IP'sini yazın (bind-address = 203.0.113.10) ve servisi yeniden başlatın: sudo systemctl restart mariadb. Doğrulama: sudo ss -tlnp | grep 3306.
2. Kullanıcı o adresten bağlanabilir mi?
MySQL'de kullanıcı adı ile birlikte hangi adresten bağlanabileceği de tanımlıdır. 'ali'@'localhost' yalnızca yerelden bağlanır. Uzaktan için ayrı bir kullanıcı tanımlayın ve yalnızca gereken adresi yazın:
sudo mysql
CREATE USER 'uyg'@'198.51.100.7' IDENTIFIED BY 'GucluBirParola';
GRANT ALL PRIVILEGES ON uygulama.* TO 'uyg'@'198.51.100.7';
FLUSH PRIVILEGES;
'%' (her adres) yazmak kolaydır ama tehlikelidir; kullanmayın. Yalnızca tek bir veritabanı için yetki verin (uygulama.*), tümü için (*.*) değil.
3. Güvenlik duvarı izin veriyor mu?
sudo ufw allow from 198.51.100.7 to any port 3306 proto tcp
3306 portunu herkese açmayın. Sunucuda panelin güvenlik duvarı aracında da kural varsa orada da izin verin: UFW rehberi.
En güvenli yol: SSH tüneli
Veritabanı portunu hiç açmadan, SSH üzerinden bağlanın. Kendi bilgisayarınızda:
ssh -L 3307:127.0.0.1:3306 [email protected]
Tünel açıkken yönetim aracınızı 127.0.0.1 adresi ve 3307 portuyla bağlayın. HeidiSQL, DBeaver, MySQL Workbench gibi araçların çoğunda ayarlarda "SSH tüneli" seçeneği vardır ve komutu sizin yerinize çalıştırır. Bu yöntemde sunucuda hiçbir ayar (bind-address, güvenlik duvarı) değişmez.
"Too many connections" hatası
Hata uygulamanızda ya da sitenizde ERROR 1040 (HY000): Too many connections olarak görünür: veritabanı sunucusu eşzamanlı bağlantı sınırına (max_connections, varsayılan çoğu kurulumda 151) ulaştı. Nedenleri:
- Bağlantı sızıntısı: Uygulama bağlantıları açıp kapatmıyor. En sık sebep budur; sınırı yükseltmek sorunu ertelemekten öteye gitmez.
- Yoğun trafik ya da bir bot saldırısı birçok sayfayı aynı anda isteyip veritabanını yoruyor: erişim günlüğüne bakın.
- Yavaş sorgular bağlantıları uzun süre tutuyor.
Kimin bağlı olduğunu görmek için:
sudo mysql -e "SHOW FULL PROCESSLIST;"
sudo mysql -e "SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected';"
Geçici çözüm: sudo mysql -e "SET GLOBAL max_connections = 300;" (yeniden başlayınca kaybolur; kalıcı için ayar dosyasının [mysqld] bölümüne max_connections = 300 yazın). Her bağlantı bellek tüketir; sınırı sunucunun belleğine göre yükseltin. Kalıcı çözüm, sızıntıyı gidermek ve önbellek kullanmaktır: WordPress hızlandırma.
Hosting paketinde bağlantı sınırlarını sunucu tarafı yönetir; sürekli bu hatayı alıyorsanız sitenizin yükünü azaltın: hosting veritabanı.
Sık sorulanlar
Hosting paketindeki veritabanına uzaktan bağlanabilir miyim?
Hosting sunucusunda veritabanı yalnızca yerelden erişilebilir; uzaktan bağlantı açık değildir. Yönetim için phpMyAdmin'i kullanın.
Bağlanıyorum ama "Access denied" alıyorum.
Kullanıcı o adresten bağlanmak için tanımlı değildir ya da parola yanlıştır. SELECT user, host FROM mysql.user; ile kullanıcı ve adres çiftlerini kontrol edin.
MariaDB mi MySQL mi?
Çoğu uygulama ikisiyle de çalışır. MariaDB, MySQL'in topluluk tarafından geliştirilen bir çatalıdır ve Debian/Ubuntu'da varsayılan seçenektir.
İlgili makaleler
- MySQL / MariaDB veritabanı nasıl kurulur ve güvenli kullanılır?
- UFW ile port açma ve kapatma (Ubuntu güvenlik duvarı)
- WordPress "Error establishing a database connection" hatası
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!