在 CentOS 7 透過 yum 安裝 MySQL 5.7 後,首次以 root 登入常遇到 ERROR 1045 (28000): Access denied for user 'root'@'localhost'。本文提供經實測驗證的標準解決流程,並解析 5.7 版密碼機制變更的根本原因。
$ mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
關鍵差異:
using password: NO → 未提供密碼,或密碼為空using password: YES → 提供了密碼但錯誤根本原因:MySQL 5.7+ 出於安全考慮,**不再預設空密碼**,且不再生成 /root/.mysql_secret 檔案。安裝過程中若未互動設定密碼,root 帳號會處於「密碼過期」或「無有效認證字串」狀態,導致無法登入。
適用版本:MySQL 5.7 / 8.0 (語法略有不同,見下文)
systemctl stop mysqld
# 或舊版指令
service mysqld stop
vim /etc/my.cnf
# 在 [mysqld] 區段末尾新增
skip-grant-tables
systemctl start mysqld
mysql -u root -p
# 直接按 Enter (無需密碼)
MariaDB [(none)]> USE mysql;
# MySQL 5.7 欄位名為 authentication_string
UPDATE user SET authentication_string=PASSWORD('NewStrongPass123!'), password_expired='N' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
QUIT;
關鍵點:MySQL 5.7 user 表已移除 Password 欄位,改用 authentication_string 儲存加密密碼。同時將 password_expired 設為 'N' 解除過期狀態。
# 移除 skip-grant-tables
vim /etc/my.cnf
# 刪除或註解該行
systemctl restart mysqld
# 驗證新密碼
mysql -u root -p'NewStrongPass123!'
# 或交互式輸入密碼
MySQL 5.7 密碼過期機制要求首次登入後必須透過 ALTER USER 重新設定密碼,否則後續操作受限:
mysql -u root -p
# 輸入新密碼登入
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
# 或舊語法 (仍支援)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass123!');
MySQL 8.0 PASSWORD() 函式已移除,認證採用 caching_sha2_password 插件:
-- 8.0 修改密碼標準語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或指定插件相容舊客戶端
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass123!';
ERROR 1820 (HY000): You must SET PASSWORD。UPDATE user SET Host='localhost' WHERE User='root';GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'%' IDENTIFIED BY '...';default_password_lifetime=90 (見相關文章)。MySQL 5.7 root 登入失敗本質是「安裝未設定密碼導致帳號處於過期/無效狀態」。透過 skip-grant-tables 繞過權限檢查,直接操作 mysql.user 表更新 authentication_string 並解除過期,再恢復權限驗證並執行 ALTER USER 完成初始化,是標準且安全的解決路徑。