mysql root密码忘记后,应通过跳过授权表、init-file注入或独立socket临时实例三种安全方式重置,核心是绕过认证校验后用alter user更新密码,而非重装或破解。

必须分两步走:先启用 validate_password 组件(不是插件),再用 ALTER USER 设置过期逻辑;只改 default_password_lifetime 对老用户完全无效。
validate_password 组件没启用,所有密码策略都白设
MySQL 8.0.17+ 默认内置的是 validate_password 组件,不是插件。查状态不能只看 SHOW PLUGINS,得执行:
SELECT * FROM performance_schema.component_table 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 决定。设成 LOW 时,哪怕 length=12,也只校验长度,不看大小写、数字、特殊字符。
-
MEDIUM:必须含至少 1 个数字、1 个大小写字母组合、1 个特殊字符 → 推荐基线配置:
SET GLOBAL validate_password.length = 12; SET GLOBAL validate_password.number_count = 1; SET GLOBAL validate_password.mixed_case_count = 1; SET GLOBAL validate_password.special_char_count = 1;
-
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 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; - 批量生成语句(安全过滤):
SELECT CONCAT('ALTER USER ''', user, '''@''', host, ''' PASSWORD EXPIRE INTERVAL 90 DAY;') FROM mysql.user WHERE password_last_changed IS NOT NULL AND user != ''; - 注意:
SET PASSWORD FOR 'u'@'h' = 'xxx'不会更新password_expired或password_last_changed,它绕过了整个过期机制
用户登录后报 ERROR 1820,但 SELECT @@global.default_password_lifetime 显示 90
这说明策略“表面生效”,但真实拦截还依赖两个隐性条件:
- 该用户账号没有
SYSTEM_VARIABLES_ADMIN或ALTER USER权限(有权限可跳过强制重置) - 连接时没带
--init-command="ALTER USER ..."这类自动执行语句 - 最可靠验证方式:用该用户账号登录后立刻执行
SELECT 1;,看到ERROR 1820 (HY000)才算真生效 -
password_expired字段只是快照,不能直接 UPDATE 修改;它只随ALTER USER PASSWORD EXPIRE等合法操作联动更新











