PASSWORD EXPIRE 不支持指定天数,仅支持 PASSWORD EXPIRE AFTER N(N为整数天);需配合 IDENTIFIED BY 使用,且受 default_password_lifetime 全局变量影响,过期后用户须由管理员用 ALTER USER 重置密码。

MySQL 5.7+ 中 PASSWORD EXPIRE 不支持指定天数
直接说结论:PASSWORD EXPIRE 本身不接受时间参数,PASSWORD EXPIRE '2025-06-01' 这种写法会报错 ERROR 1064 (42000)。MySQL 官方只提供两种固定策略:立即过期(PASSWORD EXPIRE)或永不过期(PASSWORD EXPIRE NEVER),没有内置的“有效期 X 天”语法。
真正能控制临时账号到期时间的只有 CREATE USER + ALTER USER ... PASSWORD EXPIRE AFTER N
MySQL 5.7.11 起引入了 PASSWORD EXPIRE AFTER N(N 是整数天),这才是设置相对有效期的唯一合法方式。它必须在创建用户时或后续 ALTER USER 时显式声明,且仅对新密码生效——如果用户已存在且已有密码,需先重置密码再设过期策略。
-
CREATE USER 'temp_dev'@'%' IDENTIFIED BY 'abc123' PASSWORD EXPIRE AFTER 7;—— 创建即生效,7 天后首次登录强制改密 -
ALTER USER 'temp_dev'@'%' IDENTIFIED BY 'newpass' PASSWORD EXPIRE AFTER 3;—— 重置密码同时设定 3 天有效期 - 若只执行
ALTER USER 'temp_dev'@'%' PASSWORD EXPIRE AFTER 3;(不带IDENTIFIED BY),MySQL 会忽略该语句,不报错但也不生效
用户登录时触发过期检查,但行为取决于 default_password_lifetime 全局配置
即使给用户设了 PASSWORD EXPIRE AFTER 5,如果全局变量 default_password_lifetime 为 0(默认值),该策略可能被绕过。MySQL 实际按「用户级设置」和「全局设置」取最小值判断是否过期。
- 查当前值:
SELECT @@default_password_lifetime; - 若为 0,表示全局不限制,此时用户级
AFTER N才真正起作用 - 若为非零值(如 90),而用户设的是
AFTER 7,则以 7 天为准;但如果用户没设,就按全局 90 天走 - 生产环境建议显式设为 0:
SET PERSIST default_password_lifetime = 0;,避免策略被全局覆盖
过期后用户无法执行任何操作,连 SELECT 1 都被拒绝
账号过期不是“提醒”,而是硬拦截。用户连接成功后,只要尝试执行任意语句(包括 SELECT、SHOW TABLES),MySQL 就返回错误 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- 必须由有
CREATE USER权限的管理员执行:ALTER USER 'temp_dev'@'%' IDENTIFIED BY 'newpwd'; - 不能用
SET PASSWORD,该语句在过期状态下被禁用 - 如果账号还绑定了
FAILED_LOGIN_ATTEMPTS或PASSWORD_LOCK_TIME,过期叠加锁定会导致更难恢复
最易被忽略的一点:过期时间是按“密码最后修改时间”开始计算的,不是账号创建时间。重置密码会重置倒计时,这点和预期一致,但容易在批量脚本里漏掉重置逻辑,导致临时账号意外长期存活。


















