mysql 8.0.12+ 才能稳定启用密码过期策略,5.7及更早版本不支持password expire语法;默认default_password_lifetime=0(永不过期),需先确认版本和全局变量值,再通过set persist或配置文件设为90,并对存量用户逐个执行alter user password expire interval 90 day。

MySQL 8.0.12+ 才能稳定启用密码过期策略,5.7 及更早版本不支持 PASSWORD EXPIRE 语法,强行执行会报 ERROR 1064 (42000);默认 default_password_lifetime = 0,等同于永不过期,不满足等保三级要求。
确认 MySQL 版本和当前策略状态
先跑这两条命令,别跳过:
-
SELECT VERSION();—— 必须是8.0.12或更高,8.0.0–8.0.11有已知 bug -
SELECT @@global.default_password_lifetime;—— 返回0表示未启用,返回90才算真正生效;返回NULL表示交由用户级策略决定(不推荐)
注意:SHOW VARIABLES LIKE 'default_password_lifetime' 必须在 mysql 库下执行,否则查不到;5.6 及更早版本执行该语句会报 Unknown system variable。
全局设置 default_password_lifetime(只影响新用户)
这个变量只对后续新建的用户生效,不会自动更新已有账号——这是线上漏配最高发点。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 永久生效:编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加default_password_lifetime = 90,然后重启服务(systemctl restart mysqld或systemctl restart mysql) - 临时测试可用
SET GLOBAL default_password_lifetime = 90,但重启后丢失;SET PERSIST写入mysqld-auto.cnf,但该文件易被运维脚本覆盖,不可靠 - 设为
0表示硬性禁用,设为DEFAULT或留空等同于0,不是“继承上层”——这点常被误解
为已有用户逐个执行 ALTER USER
全局设置完,必须手动处理存量账号,否则测评时会被判“部分账号未过期”直接扣分。
-
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;—— 高权限账号建议周期更短 -
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;—— 业务账号常规策略 -
ALTER USER 'svc_account'@'%' PASSWORD EXPIRE NEVER;—— 仅限服务类账号,且需配套审计日志 - 别写成
PASSWORD EXPIRE DEFAULT,它会继承全局值,不是“不过期”;也别用SET PASSWORD或UPDATE mysql.user,绕过校验且破坏密码历史记录
执行前务必查现状:SELECT user, host, password_last_changed, password_lifetime FROM mysql.user;,重点关注 password_lifetime 是否为 90,而非 NULL 或 0。
密码过期后的真实表现和应对方式
过期后首次连接会拒绝执行绝大多数语句,但不是完全断连——这点容易误判。
- 真实错误是
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.(不是1862,也不是通用登录失败) - 允许执行的命令极少:
SET、SELECT 1、ALTER USER USER() IDENTIFIED BY 'newpass';—— 其他 DML/DDL 全部报错 - 必须用支持过期密码重置的客户端:
mysql命令行(8.0.19+)或MySQL Shell(推荐),老版本客户端可能卡死 - 应用连接池要主动捕获
ERROR 1820,在建连后加一句SELECT 1;触发校验,再做重连或改密逻辑
MySQL 原生不提供“过期前提醒”,所谓提醒必须靠外部脚本定期查 password_last_changed 和 @@default_password_lifetime 计算到期时间——这点常被当成已内置功能而遗漏。










