修改 MySQL root 密碼後,登錄執行任何 SQL 報錯:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
或舊版本提示:
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement.
MySQL 5.6+ 引入密碼過期機制。通過 mysqladmin 或直接更新 mysql.user 表修改密碼時,未同步更新密碼過期狀態,導致服務器判定密碼已過期,強制要求重置。
# 正常登錄 (使用新密碼)
mysql -u root -p
# 執行重置 (密碼可相同)
mysql> SET PASSWORD = PASSWORD('YourPassword123!');
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過授權啟動
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 無密碼登錄
mysql -u root
# 4. 更新密碼與過期狀態
mysql> USE mysql;
mysql> UPDATE user SET authentication_string=PASSWORD('NewPass123!'), password_expired='N' WHERE User='root';
mysql> FLUSH PRIVILEGES;
# 5. 正常重啟
mysqladmin -u root -p shutdown
systemctl start mysqld
| 版本 | 密碼列名 | 推薦重置語法 |
|---|---|---|
| 5.7.6+ | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass'; |
| 5.7.5- | password | SET PASSWORD = PASSWORD('pass'); |
| 5.6 | password | SET PASSWORD = PASSWORD('pass'); |
| 8.0+ | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass'; |
ALTER USER 或 SET PASSWORD 官方語句修改密碼,避免直接操作系統表ALTER USER ... PASSWORD EXPIRE NEVER 禁用過期mysql_secure_installation 進行標準化安全初始化遇到 You must reset your password 錯誤,核心原因是密碼過期標記未清除。登錄後執行 SET PASSWORD + ALTER USER ... PASSWORD EXPIRE NEVER 即可秒級修復。養成使用官方密碼管理語句的習慣可從根源避免此問題。