必须启用validate_password插件并配置default_password_lifetime=90(写入my.cnf的[mysqld]段且重启),再逐个执行ALTER USER ... PASSWORD EXPIRE INTERVAL 90 DAY;插件状态须查INFORMATION_SCHEMA.PLUGINS或mysql.component表确认为ACTIVATED,仅SHOW VARIABLES不可靠。

必须先启用 validate_password 插件(或组件),再设策略参数;密码过期必须显式配置 default_password_lifetime 并重启,且老用户需逐个执行 ALTER USER ... PASSWORD EXPIRE INTERVAL ——跳过任一环节,合规检查都会失败。
怎么确认 validate_password 插件/组件已真正加载
只查 SHOW VARIABLES LIKE 'validate_password%' 不可靠,它可能返回默认值但插件根本没启。唯一可信方式是直接查元数据表:
- MySQL 5.7:执行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态必须为ACTIVE - MySQL 8.0.17+:执行
SELECT * FROM mysql.component WHERE component_urn = 'file://component_validate_password';,有结果才表示组件已安装并激活 - 返回空行 → 插件/组件未加载,后续所有
SET GLOBAL validate_password.*都无效 - Linux 下还要确认
validate_password.so文件真实存在(常见路径:/usr/lib64/mysql/plugin/validate_password.so)
配置文件里参数名写法和重启要求
配置文件(my.cnf 或 my.ini)中参数名和 SQL 中不一致,写错就静默失效:
- SQL 中用下划线:如
SET GLOBAL validate_password.length = 12; - 配置文件中必须用小写+下划线+无空格:
validate_password_length = 12、validate_password_policy = 1(1表示MEDIUM,比单词更稳) -
plugin_load_add = validate_password.so(5.7)或component = file://component_validate_password(8.0.17+)必须写在[mysqld]段 - 改完配置不重启
mysqld,插件不会加载,策略也不会生效
密码过期策略为什么设了却没用
最常见误判是以为 SET GLOBAL default_password_lifetime = 90 就万事大吉 —— 它只影响新用户,对已有账户完全无效:
- 全局策略必须写入配置文件并重启:
default_password_lifetime = 90在[mysqld]段,否则重启即丢失 - 所有现存用户(包括
root)必须单独执行:ALTER USER 'user'@'host' PASSWORD EXPIRE INTERVAL 90 DAY; - 执行后立刻查
mysql.user表:SELECT user, host, password_last_changed, password_lifetime FROM mysql.user;,确保password_lifetime是90而非NULL或0 - 如果
password_last_changed是NULL(旧密码未被重置过),需先执行一次ALTER USER 'user'@'host' IDENTIFIED BY 'xxx';强制刷新时间戳
策略生效边界和容易被忽略的细节
这两套机制都只在特定动作时触发校验,不是“实时扫描”:
-
validate_password只对CREATE USER、ALTER USER ... IDENTIFIED BY、以及root首次登录强制改密(ERROR 1820)生效;已有弱密码不会自动报错 - 密码过期判断依赖
password_last_changed + default_password_lifetime计算,不是看创建时间;该字段是 UTC 时间,和系统时区无关 -
STRONG策略若未配validate_password.dictionary_file,实际效果等同MEDIUM,但性能开销更大 - 用户有
ALTER USER权限时可自行执行PASSWORD EXPIRE NEVER绕过策略,高权限账号建议限制该权限


















