mysql 8.4 lts默认启用caching_sha2_password认证插件并强制密码复杂度策略,validate_password插件默认启用且不可跳过,alter user失败因密码不满足length≥8、大小写字母+数字+特殊字符各≥1的硬性要求,普通账户无权修改策略变量,旧语法set password和--skip-validate-password均被禁用。

MySQL 8.4 LTS 默认启用 caching_sha2_password 插件,并强制要求密码满足最低复杂度(至少 8 位、含大小写字母+数字+特殊字符),不手动干预就无法绕过。直接改 my.cnf 关闭插件或降级策略,会触发启动失败或连接拒绝——这不是配置问题,是安全机制硬约束。
为什么 ALTER USER 失败并报错 “Your password does not satisfy the current policy requirements”
这是 MySQL 8.4 启用密码验证插件(validate_password)后的默认行为。它不是警告,而是拦截:只要新密码未达策略阈值,ALTER USER ... IDENTIFIED BY 就会直接报错,不会执行。
-
validate_password插件在 8.4 中默认安装且启用,无需手动加载 - 策略由三个系统变量控制:
validate_password.length(默认 8)、validate_password.mixed_case_count(默认 1)、validate_password.number_count(默认 1)、validate_password.special_char_count(默认 1) - 修改这些变量必须有
SYSTEM_VARIABLES_ADMIN权限,普通 DBA 账户通常没有,需用root@localhost执行 - 临时绕过?不行。8.4 不再支持
SET PASSWORD = 'xxx'这类旧语法,也不接受--skip-validate-password启动参数
如何安全切换到 mysql_native_password(仅限遗留客户端必需场景)
某些老版本 JDBC 驱动(如 MySQL Connector/J 5.1.x)、PHP mysqli 扩展(caching_sha2_password 的 RSA 加密握手流程,连接时会卡在 Authentication plugin 'caching_sha2_password' cannot be loaded。此时必须显式切换认证方式,但不能全局禁用插件。
- 对单个用户执行:
ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'strong_password'; - 切勿执行
default_authentication_plugin=mysql_native_password—— 8.4 已移除该配置项,写入my.cnf会导致 mysqld 启动失败 - 切换后,该用户仍受
validate_password策略约束,密码仍需满足复杂度 - 若需批量处理,用 SQL 生成语句:
SELECT CONCAT('ALTER USER ''',user,'''@''',host,''' IDENTIFIED WITH mysql_native_password BY ''P@ssw0rd123'';') FROM mysql.user WHERE plugin = 'caching_sha2_password' AND user NOT IN ('root');
密码过期与历史策略必须显式开启才生效
MySQL 8.4 不再默认启用密码过期或历史检查,即使插件已加载。这两个功能是独立开关,需分别配置,否则 PASSWORD EXPIRE 或 PASSWORD HISTORY 语法会报错 “Unknown system variable”。
- 启用密码历史:先运行
SET PERSIST validate_password.history = 5;(保留最近 5 次密码) - 启用全局过期:运行
SET PERSIST default_password_lifetime = 90;(所有新用户默认 90 天过期) -
SET PERSIST会写入mysqld-auto.cnf,重启不失效;用SET GLOBAL则仅当前实例有效 - 用户级覆盖:对特定用户设
ALTER USER 'u'@'h' PASSWORD EXPIRE INTERVAL 30 DAY;或PASSWORD HISTORY 3; - 注意:如果
validate_password插件被意外卸载(如误执行UNINSTALL PLUGIN validate_password;),上述所有策略立即失效,且无法再通过INSTALL PLUGIN恢复——8.4 要求插件必须在启动时加载
真正容易被忽略的点是:8.4 的密码策略和认证插件深度耦合,改一个就得同步调另一个。比如把 validate_password.length 改成 6,却不重置对应用户的密码,该用户下次改密仍会因策略不匹配失败;又比如切换了认证插件,却忘了该用户依然继承全局 default_password_lifetime,结果某天凌晨连接突然中断——这些都不是 bug,是设计如此。











