MySQL ERROR 1045 (28000): Erişim Reddedildi — Neden ve Güvenli Çözüm
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.
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 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)Parantez içindeki ifade teşhisin anahtarıdır:
- •`using password: NO` → İstemci hiç şifre göndermedi. Genellikle
-punutulmuş veya~/.my.cnfokunamıyor. - •`using password: YES` → Şifre gönderildi ama kabul edilmedi. Neden şifre *veya* kimlik doğrulama eklentisi.
▸Nedeni ayırt eden sorgu
Bir yolla içeri girebiliyorsanız (ör. sudo mysql), ilk bakılacak yer eklenti sütunudur:
SELECT user, host, plugin, account_locked, password_expired
FROM mysql.user
WHERE user = 'root';Ubuntu/Debian paketlerinde root@localhost genellikle `auth_socket` eklentisiyle gelir. Bu durumda şifre hiç kullanılmaz; işletim sistemi kullanıcısı root ise doğrulama geçer. mysql -u root -p ile bağlanmaya çalışmak, şifre doğru olsa dahi 1045 üretir. Bu, sorunun bir numaralı nedenidir.
▸Adım adım çözüm
1. Socket ile girin ve eklentiyi görün.
sudo mysql -u rootSELECT user, host, plugin FROM mysql.user WHERE user = 'root';2. Eklentiyi ve şifreyi birlikte ayarlayın. SSH ile bağlanan bir geliştirme sunucusunda auth_socket yerine şifreli giriş istiyorsanız:
ALTER USER 'root'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'yeni-guclu-sifre';FLUSH PRIVILEGES gerekmez — yalnızca GRANT tablolarını doğrudan SQL ile elle güncellediğinizde gerekir.
3. Host eşleşmesini kontrol edin. 'root'@'localhost' ile 'root'@'%' ayrı hesaplardır. 127.0.0.1 üzerinden bağlanırken MySQL, host eşleşmesini ters DNS'e göre yapar ve localhost yerine 127.0.0.1 hesabını arar:
SELECT user, host FROM mysql.user WHERE user = 'root';4. Tamamen kilitliyseniz: `--init-file` yöntemi. --skip-grant-tables yaygın ama tehlikelidir: tüm yetkilendirmeyi kapatır. Daha güvenli yol, sunucuyu tek bir SQL dosyası çalıştırarak başlatmaktır:
-- /tmp/sifre-sifirla.sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yeni-guclu-sifre';sudo systemctl stop mysql
sudo mysqld_safe --init-file=/tmp/sifre-sifirla.sql &
# şifre uygulandıktan sonra normal başlatın
sudo rm /tmp/sifre-sifirla.sql
sudo systemctl start mysql--skip-grant-tables kullanmak zorunda kalırsanız mutlaka --skip-networking ile birlikte kullanın; aksi halde ağdan kimlik doğrulamasız erişim açık kalır.5. Hâlâ 1045 alıyorsanız istemci sürümüne bakın. caching_sha2_password (MySQL 8.0 varsayılanı), eski istemci kütüphaneleriyle uyumsuz olabilir. Eski bir PHP/.NET bağlayıcısı kullanıyorsanız hata mesajı aynıdır ama sorun protokol uyumsuzluğudur. Çözüm istemciyi güncellemektir; mysql_native_password 8.0.34'te kullanımdan kaldırıldı ve 9.0'da tamamen silindi.
▸Bunu bir daha yaşamamak için
Üretimde root ile uygulama bağlantısı kurmayın; uygulamaya kendi şemasında sınırlı yetkili bir kullanıcı verin. SELECT user, host, plugin FROM mysql.user çıktısını envanter olarak saklayın.
▸İlgili Mühendislik Rehberleri ve İç Linkler
- •MySQL Yedekleme & Kurtarma CheatSheet
- •MySQL Deadlock (ERROR 1213) Kılavuzu
- •Test edilen sürümler: MySQL 8.0 / 8.4 LTS
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL too many clients already Hatası: 6 Adımda Çözüm
FATAL: sorry, too many clients already hatasının üç nedeni, nedeni ayırt eden tek sorgu ve max_connections ile PgBouncer üzerinden kalıcı çözümü.
PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
18456 hatasında State numarası gerçek nedeni söyler. State 5, 8, 11, 18, 38 ve 40 için ayrı çözümler, ERRORLOG okuma komutları.