mysql 8.0.4+ 废弃下划线变量名,必须用 validate_password.policy 等点号语法;报错说明插件未加载或权限不足,需先执行 show variables like 'validate_password.%' 确认状态,再 install plugin 并用 system_variables_admin 权限设值。

为什么 SET GLOBAL validate_password.policy = 0 会报 Unknown system variable
因为 MySQL 8.0.4+ 彻底废弃了 validate_password_policy 这类下划线命名的变量,改用带点号的层级式变量名:validate_password.policy。直接敲旧写法必然触发 ERROR 1193 (HY000): Unknown system variable。
更关键的是:这个错误本身就在提示你——插件可能根本没加载。别急着设值,先确认状态:
- 执行
SHOW VARIABLES LIKE 'validate_password.%';,如果返回空,说明插件未启用 - 再查
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态不是ACTIVE就得手动装 - Linux 下运行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';;Windows 对应.dll
插件已加载,但 SET GLOBAL 仍失败的常见原因
即使插件在运行,SET GLOBAL 也可能静默失败或报错,原因很具体:
- 权限不足:MySQL 8.0.16+ 要求
SYSTEM_VARIABLES_ADMIN权限(不是老版的SUPER),用root登录也不一定默认拥有 - 变量名拼错:必须是
validate_password.policy,不能漏点、不能多空格、不能写成validate_password_policy - 依赖顺序错:必须先设
validate_password.policy,再设length、mixed_case_count等;否则部分参数会被忽略或自动重置 -
validate_password.length有硬性下限:不能低于其他参数之和(如number_count + special_char_count + 2 * mixed_case_count),设length = 4前务必同步清零其余项
my.cnf 配置写对了,重启后 SHOW VARIABLES 却没变
配置文件生效的前提非常明确:必须写在 [mysqld] 段落内,且参数名严格匹配新语法。常见失效场景:
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
- 误写成
validate_password=OFF或skip-validate-password—— 这两个配置项 MySQL 8.0 完全不识别,会被直接忽略 - 写成了
validate_password_policy = LOW(旧写法),MySQL 启动时跳过该行,不报错也不加载 - 路径错误:用
SELECT @@plugin_dir;查到的路径,和配置中plugin_load_add指向的.so文件实际位置不一致 - 没重启服务:
SET GLOBAL是临时的,而配置文件变更必须重启 mysqld 才能加载组件并读取新策略
策略调低了,ALTER USER 还是报 ERROR 1819
这通常不是策略问题,而是认证插件在捣鬼。MySQL 8.0 默认用 caching_sha2_password,它对弱密码的哈希生成有额外限制,哪怕 validate_password 放开了,它也可能拒绝存储。
解决方法很直接:
- 创建用户时显式指定插件:
CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; - 已有用户先切插件再改密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;,再ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; - 一劳永逸:在
my.cnf的[mysqld]段加default_authentication_plugin=mysql_native_password,避免新用户又走caching_sha2_password
最后提醒一句:用 --skip-grant-tables 启动后,ALTER USER 会因权限系统被禁用而报 ERROR 1290,此时必须先 FLUSH PRIVILEGES; 再执行,否则所有密码操作都会卡住。










