嘗試以 root 登錄本地 MySQL 時提示:Host 'localhost' is not allowed to connect to this MySQL server。回溯操作發現曾誤將 root 密碼直接設為明文 'YES'(而非哈希值),導致權限表數據異常,進而被拒絕訪問。
UPDATE user SET Password='YES' WHERE user='root' AND host='localhost'; 將密碼列寫入明文,MySQL 認證機制期望存儲的是 PASSWORD() 加密後的哈希值。# Windows
sc stop MySQL
# Linux
systemctl stop mysqld # 或 service mysqld stop
mysqld --skip-grant-tables &
此模式下 MySQL 不加載權限表,允許無密碼、無權限檢查直接進入控制台。僅限本地緊急修復使用,切勿在生產環境長期運行。
mysql -u root
# 進入 mysql> 提示符後執行:
UPDATE mysql.user SET authentication_string=PASSWORD('新密碼') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
EXIT;
關鍵點: MySQL 5.7+ 密碼列為 authentication_string,5.6 及之前為 Password;務必使用 PASSWORD() 函數生成哈希值,不可寫入明文。
# 終止 --skip-grant-tables 進程
mysqladmin -u root shutdown
# 正常啟動服務
systemctl start mysqld
# 驗證新密碼
mysql -u root -p
mysqladmin -u root shutdown 強制關閉。ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';(MySQL 5.7+)或 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密碼');。mysql 系統庫,尤其是 user、db、tables_priv 等權限相關表。