mysql 8.0 初始化必触发密码校验,因默认自动加载 validate_password 插件并启用 strong 策略;唯一合法跳过方式是使用 --initialize-insecure(仅限测试)或在 my.cnf 中配置 plugin-load-remove=validate_password 并配合 --defaults-file 执行。

MySQL 8.0 初始化时无法跳过密码策略检查,是因为默认启用 validate_password 插件且未加载就设变量会失败——必须在初始化前明确禁用或改用 --initialize-insecure(仅限测试环境)。
为什么 mysqld --initialize 一定会触发密码校验
MySQL 8.0 的 mysqld --initialize 命令默认启用密码复杂度检查,即使你没手动装插件,只要数据目录是全新初始化的,它就会自动加载 validate_password 并使用 STRONG 策略。这不是配置问题,是初始化流程内置行为。
- 临时密码生成后写入错误日志(如
/var/log/mysqld.log或 Windows 的Data/hostname.err),但你不能绕过它去设弱密码 - 执行
ALTER USER 'root'@'localhost' IDENTIFIED BY '123'会直接报错ERROR 1819 (HY000) -
SET GLOBAL validate_password.policy = LOW在初始化完成前根本不可用——变量不存在,插件也没加载
真正能跳过校验的两种初始化方式
只有两个合法入口点可以避开密码策略:一个是彻底不生成密码(测试专用),另一个是启动前禁用插件加载(需修改配置)。
-
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql:生成空密码 root 用户,仅限本地测试环境;生产环境禁止使用,官方文档明确标记为不安全 - 在
my.cnf的[mysqld]段加plugin-load-remove=validate_password,再执行mysqld --initialize;该参数告诉 MySQL 启动时不加载该插件,从而跳过所有校验逻辑 - 注意:
skip-validate-password是无效写法,MySQL 8.0 不识别这个配置项
初始化后立即要做的事:插件状态比密码还关键
哪怕你用了 --initialize-insecure,只要后续想用密码策略(比如设 history 或 reuse interval),就必须手动加载插件并确认状态,否则相关变量全是无效的。
- 登录后立刻执行:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';—— 若为空或DISABLED,说明插件根本没生效 - 加载命令必须带完整路径名:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'(Linux)或'validate_password.dll'(Windows) -
plugin_dir路径必须正确:SELECT @@plugin_dir;,Docker 官方镜像常删掉该文件,得挂载或换基础镜像
最容易被忽略的是:初始化命令和配置文件必须严格匹配。比如你在 my.cnf 里写了 plugin-load-remove,但执行 mysqld --initialize 时没指定 --defaults-file,MySQL 就会读默认路径的配置,导致禁用失效。











