「Access denied for user ... (using password: YES)」是 MySQL 運維中最高頻錯誤之一。本文從權限表結構入手,給出 Windows/Linux/通用三種場景的標準化修復流程。
mysql.user 表中存在 User=''(匿名用戶)或 Host 匹配順序導致「錯誤賬號優先命中」。MySQL 驗證邏輯:按 Host、User 排序,第一匹配勝出;匿名用戶 User='' 排在具體用戶之前,導致合法用戶被誤判為匿名並拒絕。
-- 登入後執行
USE mysql;
SELECT Host, User FROM user; -- 確認是否有 User=''
DELETE FROM user WHERE User = '';
FLUSH PRIVILEGES;
或將其重命名:UPDATE user SET User='app_user' WHERE User='';
systemctl stop mysqldmysqld_safe --skip-grant-tables --skip-networking &mysql -u root mysql(無密碼進入)SELECT * FROM user; 為空,說明權限表損壞,需重建:INSERT INTO user(Host,User,Password,Select_priv,Insert_priv,Update_priv) VALUES('localhost','root',PASSWORD('newpwd'),'Y','Y','Y');FLUSH PRIVILEGES;,重啟服務驗證。data 目錄 → 重裝 MySQL → 逐個刪除重建用戶 → 覆蓋回數據目錄。FLUSH PRIVILEGES; 或重啟服務。skip-grant-tables 後直接暴露 3306 端口,務必加 --skip-networking。caching_sha2_password,舊客戶端需指定 --default-auth=mysql_native_password 或改回 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd';