MySQL 8.0密码过期与强密码策略必须分步激活:先安装validate_password组件,再配置策略变量,最后对每个老用户执行ALTER USER显式设置;default_password_lifetime=90仅影响新用户,老用户如root需单独ALTER USER PASSWORD EXPIRE INTERVAL 90 DAY才生效。

MySQL 8.0 的密码过期和强密码不是设个变量就自动生效的两件事,而是必须分步激活、分别配置、且对老用户完全无效的两套独立机制。不先装 validate_password 组件,再严的策略也拦不住 123456;不显式执行 ALTER USER ... PASSWORD EXPIRE,default_password_lifetime = 90 对 root 或 admin 一丁点作用都没有。
validate_password 组件没启用,所有密码复杂度设置都白搭
MySQL 8.0.17+ 默认内置的是组件(component),不是插件(plugin)。只查 SHOW PLUGINS 会漏掉它,必须用:
SELECT * FROM performance_schema.components WHERE component_name = 'validate_password';
没结果?说明没加载。此时任何 SET GLOBAL validate_password.length = 12 都会报错 Unknown system variable。
- 临时启用(重启失效):
INSTALL COMPONENT 'file://component_validate_password'; - 持久启用(推荐):在
/etc/my.cnf的[mysqld]段加一行component-load-add=validate_password,然后重启mysqld - 验证是否生效:
SHOW VARIABLES LIKE 'validate_password%';应该能列出一堆变量,比如validate_password.policy
设了 validate_password.length 却拦不住弱密码?检查 policy 级别
validate_password.length 是硬门槛,但具体校验哪些字符类型,由 validate_password.policy 决定。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
POLICY = LOW:只校验长度,哪怕设成 12,aaaaaa123也能过 -
POLICY = MEDIUM(推荐基线):必须含至少 1 个数字、1 个大小写字母组合、1 个特殊字符。配法如下:
SET GLOBAL validate_password.length = 12;<br>SET GLOBAL validate_password.number_count = 1;<br>SET GLOBAL validate_password.mixed_case_count = 1;<br>SET GLOBAL validate_password.special_char_count = 1;
-
POLICY = STRONG:额外要求禁用字典词,必须配validate_password.dictionary_file,且路径必须是绝对路径、MySQL 进程可读、每行纯 ASCII 单词、末尾有换行符 - 动态设置后务必验证:
SELECT VALIDATE_PASSWORD_STRENGTH('Abc123!');返回值 ≥ 50 才算通过MEDIUM
default_password_lifetime = 90 不会让 root 密码 90 天后过期
这个变量只影响新创建的用户。已存在的用户(包括 root、admin)完全不受影响,哪怕你刚重置过密码。
-
SELECT @@global.default_password_lifetime;返回NULL表示未初始化,行为等同于 0(永不过期) - 让老用户真正受控,只能逐个执行
ALTER USER:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;<br>ALTER USER 'dev'@'%' PASSWORD EXPIRE; -- 立即过期<br>ALTER USER 'svc_backup'@'localhost' PASSWORD EXPIRE NEVER; -- 永不过期
- 注意:
UPDATE mysql.user SET password_expired = 'Y'完全无效——该字段是只读快照,不驱动行为 - 验证是否生效:用该用户登录后执行
SELECT 1;,若报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.,才算真正起效
密码重用限制必须配合改密动作才生效
MySQL 的密码重用控制靠两个变量:password_history 和 password_reuse_interval,但它们只对“启用后首次执行的 ALTER USER ... IDENTIFIED BY”生效。
- 设为禁止重用最近 5 次密码:
SET PERSIST password_history = 5; - 设为 365 天内不得复用旧密码:
SET PERSIST password_reuse_interval = 365; - 关键点:这些限制不会回溯历史密码;只有你在启用之后,用
ALTER USER 'u'@'h' IDENTIFIED BY 'newpass'修改密码时,才会触发校验 - 如果用户用
SET PASSWORD或旧客户端改密,可能绕过校验——建议统一用ALTER USER并确认客户端版本 ≥ 8.0.19
最常被忽略的其实是顺序和作用域:先装组件,再设策略变量,最后对每个存量用户单独 ALTER USER;三者缺一不可,且不能颠倒。生产环境切忌只改 my.cnf 就以为万事大吉。

















