直接查看 default_password_lifetime 全局变量值:执行 select @@default_password_lifetime; 返回 0 表示永不过期(mysql 8.0+ 默认),正整数表示新用户密码默认过期天数,null 表示版本过低。

怎么查当前密码过期策略是否生效
直接看 default_password_lifetime 这个全局变量值,它决定了新用户的默认行为。执行:SELECT @@default_password_lifetime;
返回 0 表示永不过期(MySQL 8.0+ 默认值);返回正整数(如 90)表示新用户密码默认多少天后过期。
注意:这个值只影响「之后创建或显式设为 DEFAULT 的用户」,已存在的用户不受影响,除非你单独改过他们。
- 如果返回
NULL,说明 MySQL 版本太低( - 如果返回非 0 但用户没过期,别慌——检查该用户是否被设成了
PASSWORD EXPIRE NEVER,优先级更高 -
mysql.user表里的password_lifetime字段才是用户实际生效的天数,password_expired是当前状态(Y/N)
给指定用户设 30 天过期或永不过期
用 ALTER USER 直接改,最常用也最可控:
- 让 root 每 30 天必须换一次密码:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY; - 让某个账号彻底免过期(比如监控账号、应用连接池账号):
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER; - 恢复成用全局策略(比如你刚把
default_password_lifetime改成 60,想让它跟着走):ALTER USER 'backup_user'@'10.0.0.%' PASSWORD EXPIRE DEFAULT;
改完不用重启 MySQL,也不用 FLUSH PRIVILEGES —— ALTER USER 自带刷新权限。但要注意:如果用户正在连接中,这次修改对当前会话无效,下次登录才触发检查。
用户登录时报 “Your password has expired” 怎么救
这不是连不上,而是连上了但立刻被拦住执行任何命令。典型场景是 DBA 强制过期后用户第一次登录,或密码真超时了。
- 必须用能处理过期密码的客户端登录,比如原生命令行
mysql -u xxx -p;SQLyog、Navicat 旧版本可能直接报错退出 - 登录成功后第一件事就是改密码:
ALTER USER USER() IDENTIFIED BY 'new_strong_pass'; - 不能用
SET PASSWORD = ...,MySQL 5.7.6+ 已弃用该语法,且对过期用户不生效 - 如果提示
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement,说明账户处于“首次登录强制改密”状态,仍用上面那条ALTER USER USER()即可
在配置文件里永久生效,但别漏掉重启和版本兼容
想一劳永逸?编辑 my.cnf 或 my.ini,在 [mysqld] 下加一行:
default_password_lifetime = 90
但这不是写完就完事:
- 必须重启 MySQL 服务,否则只对当前运行实例无效
- MySQL 5.7.4 之前版本不识别这个参数,配置后启动会报 warning 甚至失败
- 如果已有大量用户,这个设置只管「新用户」,老用户还是得一个个
ALTER USER批量处理 - 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁用该参数写入配置文件,只能通过控制台或 SQL 设置
真正容易被忽略的是:password_last_changed 字段记录的是「最后一次改密时间」,不是「创建时间」。如果你用 CREATE USER 创建账号但没设密码,再用 ALTER USER ... IDENTIFIED BY 补密码,这个时间戳才会更新——否则过期计算会出错。










