mysql如何设置密码过期时间_mysql密码有效期管理

4次阅读

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

mysql如何设置密码过期时间_mysql密码有效期管理

怎么查当前密码过期策略是否生效

直接看 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.cnfmy.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 补密码,这个时间戳才会更新——否则过期计算会出错。

text=ZqhQzanResources