MySQL 8.0.17+需先安装component_validate_password组件并正确配置my.cnf参数(如下划线命名、component-load-add),否则validate_password变量不可用且策略不生效。

validate_password没启用,所有配置都白设
直接执行 SET GLOBAL validate_password.length = 12 报错 Unknown system variable?说明插件/组件根本没加载。MySQL 8.0.17+ 默认内置的是 component,不是插件,SHOW PLUGINS 查不到它不等于缺失,而是没启用。
必须先确认状态再操作:
- 查组件:运行
SELECT * FROM mysql.component WHERE component_urn = 'file://component_validate_password';,无结果就得装 - 查插件(兼容兜底):运行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态不是ACTIVE就得装 - 查变量:运行
SHOW VARIABLES LIKE 'validate_password%';,如果只返回默认值(比如validate_password_length = 8)且没其他变量,基本可断定未启用
启用方式按版本走:
- MySQL 8.0.17+(推荐):
INSTALL COMPONENT 'file://component_validate_password'; - MySQL 5.7 或 8.0.17 以下:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows)
my.cnf里写错参数名,重启后策略照样失效
配置文件中参数命名规则和 SQL 中完全不同:SET GLOBAL validate_password.length = 12 是对的,但写进 /etc/my.cnf 的 [mysqld] 段时,必须写成 validate_password_length = 12——下划线要去掉,首字母小写,不能带点。
常见错误写法(全部无效):
validate_password.length = 12validate-password-length = 12-
validate_password_length=12(等号前后有空格不影响,但建议统一)
完整推荐写法(永久生效):
[mysqld] component-load-add=validate_password validate_password_length = 12 validate_password_policy = 1 validate_password_number_count = 1 validate_password_mixed_case_count = 1 validate_password_special_char_count = 1
注意:component-load-add 是 8.0.17+ 持久化启用组件的正确配置项;5.7 应用 plugin-load-add=validate_password.so。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
policy设成MEDIUM,但弱密码还能通过?检查依赖项是否齐备
validate_password.policy = MEDIUM 不是开关,而是一组校验规则的总控。它要求同时满足长度、数字、大小写字母、特殊字符四项——但前提是对应 _count 参数都 ≥1。如果只设了 policy = MEDIUM 和 length = 12,却漏了 number_count,那 MySQL 实际只校验长度,等效于 LOW。
必须一起配全(缺一不可):
-
validate_password.policy = 1(或MEDIUM) -
validate_password.length ≥ 8(建议 ≥12) validate_password.number_count ≥ 1-
validate_password.mixed_case_count ≥ 1(表示至少含 1 个大写 + 1 个小写) validate_password.special_char_count ≥ 1
验证是否真生效:SELECT VALIDATE_PASSWORD_STRENGTH('Abc123!'); 返回值 ≥ 50 才算通过 MEDIUM;试 'abc123' 应该返回 0 或很低分。
ALTER USER报ERROR 1819,不是密码问题,是策略没覆盖到老用户
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 出现,说明策略已启用且正在起作用,但别急着改密码——先确认你是不是在改一个“老用户”。default_password_lifetime 和 validate_password 策略都只对新建用户或显式执行 ALTER USER ... IDENTIFIED BY 的操作生效,不会自动扫描已有账户。
更关键的是:default_password_lifetime = 90 对 root 这类初始用户完全无效,哪怕刚重置过密码。要让 root 受限,必须单独执行:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
同理,密码复杂度校验也只在你主动改密时触发。所以 ERROR 1819 是正常信号,说明策略拦住了弱密码;但如果反复出现,大概率是你漏配了某项 _count 参数,或者误以为策略会批量修正历史账户。










