phpMyAdmin 5.2 不支持图形化配置密码过期策略,必须通过 SQL 执行 ALTER USER PASSWORD EXPIRE 命令(如 INTERVAL 60 DAY、PASSWORD EXPIRE 或 PASSWORD EXPIRE NEVER),并注意 host 精确匹配及 default_password_lifetime 仅影响新用户。

phpMyAdmin 5.2 本身不提供图形化界面设置 MySQL 密码到期策略的功能——所有密码过期规则必须通过 SQL 命令在 MySQL 服务端配置,phpMyAdmin 只是执行工具。
ALTER USER PASSWORD EXPIRE 是唯一有效方式
MySQL 8.0+ 的密码过期策略是账户元数据属性,不是 phpMyAdmin 能“勾选”的开关。你必须用 ALTER USER 显式设置,SET PASSWORD 或界面改密码操作完全无效。
-
ALTER USER 'dev'@'10.0.0.%' PASSWORD EXPIRE INTERVAL 60 DAY;:60 天后自动过期 -
ALTER USER 'admin'@'localhost' PASSWORD EXPIRE;:立即过期,下次登录首次非-SET语句就报ERROR 1820 -
ALTER USER 'backup'@'%' PASSWORD EXPIRE NEVER;:清除该用户的过期策略(注意不是设为永不过期,而是移除) - 主机名必须精确匹配:
'user'@'localhost'和'user'@'127.0.0.1'是两个独立账号,策略互不影响
default_password_lifetime 只影响新用户
你在 phpMyAdmin 的「SQL」页执行 SET GLOBAL default_password_lifetime = 90;,只会让后续新建的用户默认 90 天过期,对已有用户(包括刚改完密码的)零影响——这是线上误操作最高发点。
- 永久生效需写入
/etc/my.cnf的[mysqld]段并重启 mysqld - 验证是否生效:运行
SELECT @@global.default_password_lifetime;,返回90才算成功 - 设为
0表示永不过期;设为NULL表示交由用户级策略决定(不推荐)
查哪些用户已过期或快过期?别只看 password_expired
password_expired = 'Y' 只表示被手动设为过期,不代表“已超期”。真正超期要靠计算:password_last_changed + default_password_lifetime。
立即学习“PHP免费学习笔记(深入)”;
- 查显式过期用户:
SELECT user, host FROM mysql.user WHERE password_expired = 'Y'; - 查自动超期用户(含已过期 + 7 天内将过期):
SELECT user, host, password_last_changed, TIMESTAMPADD(DAY, @@default_password_lifetime, password_last_changed) AS expires_at FROM mysql.user WHERE password_last_changed IS NOT NULL AND @@default_password_lifetime > 0 AND TIMESTAMPADD(DAY, @@default_password_lifetime, password_last_changed) -
password_last_changed是 UTC 时间,和本地时区无关
最常被忽略的一点:密码过期不是连接时拦截,而是在用户登录后首次执行非-SET语句(比如 SELECT * FROM t)时才触发报错。这意味着连接池可能维持着“看似正常但实际无法执行业务语句”的连接,监控和告警必须覆盖这个阶段,不能只盯 mysql.user 表字段。



















