MySQL 5.6+ 強制要求首次登錄後修改初始隨機密碼,否則拒絕執行任何語句。本文提供兩種修復方案:--skip-grant-tables 重置密碼、SET PASSWORD 直接修改,並解釋 mysqladmin 密碼修改失效的原因。
# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
# mysqladmin -u root -p password 'newpass'
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限表、禁用網絡啟動
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# 3. 無密碼登錄
mysql -u root mysql
# 4. 更新所有 root 賬號密碼
UPDATE user SET Password=PASSWORD('newpassword')
WHERE User='root' AND (Host='localhost' OR Host='127.0.0.1' OR Host='::1' OR Host='%');
# 5. 刷新權限並退出
FLUSH PRIVILEGES;
QUIT
# 6. 正常重啟
systemctl restart mysqld
# 7. 驗證
mysql -uroot -pnewpassword
若已能登錄(如臨時密碼、.mysql_secret),直接執行:
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.00 sec)
mysql_install_db/mysqld --initialize 生成隨機臨時密碼(寫入 ~/.mysql_secret 或錯誤日志)。password_expired='Y',首次登錄強制 SET PASSWORD 才能執行後續語句。mysqladmin password 走舊協議,不支持過期密碼流程,故失敗。~/.mysql_secret 獲取臨時密碼。--skip-grant-tables 時長,操作完成立即重啟恢復權限檢查。ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; 替代 SET PASSWORD。ERROR 1820 不是安裝失敗,而是安全機制生效。掌握「臨時密碼登錄 → SET PASSWORD」標準流程,或「skip-grant-tables 緊急重置」備用方案,能在 2 分鐘內解決首次登錄受阻問題。