dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
[Teşhis]MySQL MySQL 8.0 / 8.4Intermediate
4 dk okuma

MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi

MySQL ERROR 1045 (28000): Erişim Reddedildi — Neden ve Güvenli Çözüm

Yazar / Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
ERROR 1045 (28000): Access denied for user 'root'@'localhost'
İ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 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 -p unutulmuş veya ~/.my.cnf okunamı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:

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

bash
sudo mysql -u root
sql
SELECT 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:

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

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

sql
-- /tmp/sifre-sifirla.sql ALTER USER 'root'@'localhost' IDENTIFIED BY 'yeni-guclu-sifre';
bash
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
[!WARNING] --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 Diğer Üretim Rehberleri

Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.

Tümünü Gör