MySQL 5.7 升级到 8.0 后 validate_password 插件默认启用且策略变严格,导致弱密码被拒、SET PASSWORD 报 ERROR 1819;需通过 INSTALL PLUGIN 加载插件并 SET GLOBAL 配置策略,或启动时加 skip-validate-password 临时绕过,最终应将策略参数写入 my.cnf 持久化。

MySQL 5.7 升级到 8.0 后,validate_password 插件默认启用,且策略变严格(比如要求至少 8 位、大小写字母、数字、特殊字符)。如果你没在升级前配置好,新实例启动后会直接拒绝弱密码,连 root 初始化都可能失败——这不是 bug,是设计行为。
为什么升级后 set password 失败或报 ERROR 1819
这是因为 MySQL 8.0 默认加载了 validate_password 插件,并使用 STRONG 策略。而你从 5.7 升级上来时,如果没显式禁用或调低策略,ALTER USER ... IDENTIFIED BY 就会触发校验并报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
常见于以下场景:
- 用
mysqld --initialize初始化 8.0 数据目录后,想改 root 密码 - in-place 升级后首次连接,执行
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; - 脚本中硬编码了简单密码,升级后批量执行失败
如何手动安装并配置 validate_password 插件
插件在 8.0 中是内置的,但默认不自动启用(除非你用了 --initialize 或 rpm/deb 安装包的默认配置)。手动启用需两步:加载 + 设置参数。
进入 MySQL(必须有 SUPER 权限):
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
然后设置策略等级(按需选其一):
- 宽松:
SET GLOBAL validate_password.policy = LOW; - 中等(推荐过渡期用):
SET GLOBAL validate_password.policy = MEDIUM; - 严格(默认):
SET GLOBAL validate_password.policy = STRONG;
还可调整具体规则,例如允许 6 位密码:
SET GLOBAL validate_password.length = 6;
⚠️ 注意:validate_password.length 必须 ≥ validate_password.number_count + validate_password.mixed_case_count + validate_password.special_char_count,否则 SET 会报错。
升级时绕过密码策略的临时方案
如果你只是想让升级流程跑通,不想立刻处理密码合规性,最稳妥的做法是在启动 mysqld 时跳过插件加载:
- 编辑
/etc/my.cnf,在[mysqld]下添加:skip-validate-password - 或者启动时加参数:
mysqld --skip-validate-password --user=mysql
这样插件不会加载,validate_password.* 系统变量也不可见,所有密码操作都不受限制。等服务起来后再按需 INSTALL PLUGIN 并配置。
⚠️ 不建议长期使用 skip-validate-password,生产环境应明确策略并写入配置文件,避免重启后失效。
配置文件中持久化策略设置
仅靠 SET GLOBAL 是临时的,MySQL 重启后丢失。要把策略固化,必须写进 my.cnf:
[mysqld] validate_password.policy=LOW validate_password.length=6 validate_password.number_count=1 validate_password.mixed_case_count=1 validate_password.special_char_count=0
然后重启 mysqld(或先 UNINSTALL PLUGIN validate_password; 再重启,确保重载生效)。
注意:如果配置了 validate_password.dictionary_file,路径必须真实存在且 MySQL 进程有读权限,否则启动失败。
真正容易被忽略的是:in-place 升级时,旧的 my.cnf 不会自动适配 8.0 的插件路径和参数名,validate_password 相关项若残留 5.7 风格的配置(比如 password_policy),会被忽略甚至引发启动警告。











