ERROR 1862 表示 MySQL 5.7 密码已过期,需人工干预重置密码并禁用过期策略:优先用 mysql -u root -p 登录后执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass' PASSWORD EXPIRE NEVER;若无法登录,则启用 --skip-grant-tables 模式,更新 authentication_string 和 password_expired 字段并执行 FLUSH PRIVILEGES;同时确认配置文件中 default_password_lifetime = 0 并重启服务,且同步更新应用配置及 host 匹配项。

ERROR 1862 登录失败:密码已过期,但客户端不支持重置流程
MySQL 5.7 默认启用密码过期策略(default_password_lifetime=90),升级后旧密码若超过有效期,部分客户端(如旧版 Navicat、某些 JDBC 驱动、PHP mysqli)会直接报错 ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords,而不是弹出密码修改提示。这类客户端无法触发 MySQL 的交互式密码重置流程,导致连接中断。
解决前提是:你仍能通过其他方式获得一次登录机会(比如本地终端、有权限的其他账号、或临时跳过验证)。不能靠客户端自动修复,必须人工干预。
- 优先尝试用命令行登录:
mysql -u root -p—— 如果还能输入旧密码并进入,说明只是过期未锁定,可立即执行ALTER USER - 若连命令行也拒绝登录,说明密码已完全失效,需进入
--skip-grant-tables模式 - 注意:Windows 下配置文件通常是
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini,不是Program Files下的my-default.ini
ALTER USER 重置密码时必须同时禁用过期标记
只改密码不关过期状态,下次登录还会报错。MySQL 5.7+ 要求显式设置 PASSWORD EXPIRE NEVER 或更新 password_expired 字段,否则即使密码正确,也会在首次查询时抛出 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement。
推荐用标准 SQL 方式(兼容性好、语义清晰):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!' PASSWORD EXPIRE NEVER;
如果已有登录但权限受限(比如没 CREATE USER 权限),可用低阶方式(仅限紧急修复):
UPDATE mysql.user SET authentication_string = PASSWORD('NewPass123!'), password_expired = 'N' WHERE User = 'root' AND Host = 'localhost';<br>FLUSH PRIVILEGES;
-
PASSWORD()函数在 MySQL 8.0 已弃用,但在 5.7 完全可用;不要用OLD_PASSWORD() - 务必执行
FLUSH PRIVILEGES,否则修改不生效 - 修改后立刻验证:
SELECT User, Host, password_expired, password_last_changed FROM mysql.user WHERE User = 'root';
永久关闭过期策略:配置文件 vs 运行时 SET GLOBAL
运行时执行 SET GLOBAL default_password_lifetime = 0 只对当前实例有效,MySQL 重启后恢复默认值(90 天)。生产环境若不想频繁维护,必须写入配置文件并重启服务。
编辑 /etc/my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 段下添加:
default_password_lifetime = 0
- 该设置影响所有新创建用户;已有用户的
password_expired状态不会自动变,仍需单独ALTER USER - 若只想让某个用户永不过期,用:
ALTER USER 'appuser'@'%' PASSWORD EXPIRE NEVER; - 设为
0表示永不过期;设为正整数(如180)表示多少天后过期
升级后连接中断的典型遗漏点
很多人修完密码就以为结束了,结果应用还是连不上——往往卡在三个细节上:
- 忘记改应用配置里的密码字段:Spring Boot 的
spring.datasource.password、Django 的DATABASES['default']['PASSWORD']等必须同步更新 - 没重启 MySQL 服务:配置文件改了但没
systemctl restart mysql或 Windows 服务重启,default_password_lifetime不生效 - host 匹配错误:
'root'@'localhost'和'root'@'127.0.0.1'是两个不同用户,查mysql.user表确认实际匹配的是哪个Host
最易被忽略的是:MySQL 5.7 升级后,部分老应用依赖的 mysql_old_password 插件已被移除,若客户端强制使用旧认证协议,即使密码正确也会拒绝连接——此时需确保用户 plugin 是 mysql_native_password,必要时执行:ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pass';


















