ERROR 1820 表示密码已过期,登录后仅允许执行 ALTER USER 修改密码,其他任何语句均失败;必须立即执行 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码',确认 host 匹配后退出重连。

ERROR 1820 登录后立刻报错怎么办
只要密码已过期,哪怕你用正确密码成功登录,第一条命令就会触发 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement。这不是权限问题,是 MySQL 强制进入“受限会话模式”——此时只允许执行一条 ALTER USER,其他任何语句(包括 USE mysql、SELECT、FLUSH PRIVILEGES)都会直接失败。
必须严格按以下顺序操作:
- 登录后不敲任何其他命令,立刻执行:
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码'; - 主机部分必须完全匹配,查准用:
SELECT user, host FROM mysql.user WHERE user = '用户名'; - 执行完立即退出:
exit,然后用新密码重连 -
SET PASSWORD在 5.7.6+ 和 8.0+ 中仅改密不解除过期状态,无效
root 密码过期且无其他高权限账号时怎么救
没有可用管理员账号时,唯一可行路径是绕过权限验证启动 mysqld。注意:这需要操作系统级权限,且操作期间服务不可用。
步骤如下:
- 停服务:
sudo systemctl stop mysql(Linux)或结束mysqld.exe进程(Windows) - 跳过验证启动:
mysqld --skip-grant-tables --skip-networking & - 免密登录:
mysql -u root - 执行重置:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';(若不确定 host,先查SELECT host FROM mysql.user WHERE user = 'root';) - 退出后杀掉 mysqld 进程,再正常启动服务
不要用 UPDATE mysql.user 直接改 authentication_string,MySQL 5.7.6+ 已弃用该方式,且易破坏一致性。
为什么 ALTER USER 后还是报 ERROR 1820
常见原因不是语法错,而是执行时机或上下文不对:
- 登录后先执行了任何其他语句(哪怕只是回车、空行),会立即锁死会话
- host 写错:
'root'@'localhost'和'root'@'127.0.0.1'是两个用户,Windows 默认可能建的是后者 - 账户同时被锁定:
SELECT account_locked, password_expired FROM mysql.user WHERE user = 'xxx';若两者都为Y,需一步到位:ALTER USER 'xxx'@'%' IDENTIFIED BY '新密码' ACCOUNT UNLOCK; - 用了旧版兼容写法:
SET PASSWORD FOR 'u'@'h' = PASSWORD('x')不清password_expired标志位,本质无效
永久禁用或调整密码过期策略
生产环境不建议直接关掉,但可合理调长周期或按需关闭个别用户:
- 全局禁用(永不过期):
SET GLOBAL default_password_lifetime = 0;,并写入my.cnf的[mysqld]段落以持久化 - 单用户永不过期:
ALTER USER '用户名'@'主机' PASSWORD EXPIRE NEVER; - 设为 90 天有效期:
ALTER USER '用户名'@'主机' PASSWORD EXPIRE INTERVAL 90 DAY; - 恢复使用全局策略:
ALTER USER '用户名'@'主机' PASSWORD EXPIRE DEFAULT;
真正容易被忽略的点是:default_password_lifetime 只影响新创建用户;已有用户的过期状态由其 password_last_changed 和 password_lifetime 字段单独计算,改全局参数不会自动刷新旧用户状态。


















