登录 MySQL 后,所有操作都遇到“ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement”错误?别担心,这并不是权限问题,也不是密码输错,而是 MySQL 5.7.6 及以上版本引入的密码过期机制所致。安装过程中生成的初始密码会被系统标记为“已过期”,即使你刚刚输入正确密码成功登录,只要没有显式重置密码,任何命令都会被阻止执行。

最快解决方案:直接使用 ALTER USER 命令重置密码即可,无需重启数据库、跳过授权表或修改配置文件,也不需参考旧版教程中的 SET PASSWORD 或 UPDATE user 语句。
为什么登录后立即报 ERROR 1820?
从 MySQL 5.7.6 开始,默认启用了密码过期策略。安装时生成的随机初始密码虽然能让你登录,但系统内部将其标记为“已过期”。换句话说,MySQL 要求你使用这个临时密码进入后,主动设置一个新密码,才算完成身份验证。只要未执行这一步,任何后续操作(包括 SHOW DATABASES、USE mysql,甚至 HELP)都会触发 ERROR 1820。
这不是一个错误,而是强制性的安全机制——确保你确认新密码的有效性。
哪个 ALTER USER 语句才能生效?
避免踩坑:网上许多老教程仍在推荐 SET PASSWORD 或 UPDATE mysql.user,但在当前主流版本(5.7.6+ / 8.0+)中,只有 ALTER USER 被认可为合法的重置方式,且必须包含完整的 host 信息,或者使用 USER() 动态获取当前上下文。以下两种写法均可,推荐第一种:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_pass';(明确指定 host,最稳妥)ALTER USER USER() IDENTIFIED BY 'your_new_pass';(通用写法,自动取当前登录用户和 host)
注意:切勿只写 ALTER USER 'root' IDENTIFIED BY ...——缺少 host 会导致语句执行成功,但实际上并未修改到正确的用户记录,下次登录仍然报错。
密码不符合策略要求怎么办?
执行 ALTER USER 时若提示 Your password does not satisfy the current policy requirements,说明你安装 MySQL 时启用了 validate_password 插件。临时绕过的办法是:先降低策略等级,再重置密码。
- 先运行
SET GLOBAL validate_password.policy = LOW;(或= 0) - 再运行
SET GLOBAL validate_password.length = 4;(允许最小长度) - 然后立即执行
ALTER USER ... IDENTIFIED BY '1234'
注意:这些 SET GLOBAL 设置仅在当前会话中生效,重启后恢复默认策略。若要永久关闭策略检查,需在 my.cnf 配置文件中添加 validate_password=OFF。
改完密码仍然报错?检查这三点
很多细节容易被忽视,请逐一排查:
- 需要执行
FLUSH PRIVILEGES;吗? 完全不需要——ALTER USER自带权限刷新,手动添加反而多余。 - host 匹配是否正确?
'root'@'localhost'和'root'@'127.0.0.1'是两个不同的账户。先执行SELECT user, host FROM mysql.user;确认实际是哪个 host,再针对性地执行ALTER USER。 - 客户端连接方式是什么? 在 macOS/Linux 下直接
mysql -u root默认走 socket 文件,对应localhost;如果加上-h 127.0.0.1则走 TCP,对应127.0.0.1—— 密码必须设置在对应 host 的那一行上。
最稳妥的做法:登录后第一件事就是执行 SELECT user(), current_user();,确认你当前使用的用户和 host,再执行 ALTER USER。这一步能帮你避免 90% 的“改完还报错”问题。
