密码策略通过validate_password插件校验新密码强度,仅在创建用户、alter user、set password时生效,不追溯旧密码;默认medium策略常致连接失败,可临时设low并调低长度,或永久配置my.cnf。

密码策略不是“限制用户改密码”,而是强制新密码合规
MySQL 本身不提供「禁止某用户修改自己密码」的权限开关,ALTER USER ... IDENTIFIED BY 是用户级操作,只要用户有 CREATE USER 或 UPDATE 权限(或更高),就能执行。真正起作用的是 validate_password 插件——它在你设新密码时校验强度,不达标就直接报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。所以所谓“限制”,其实是用策略把弱密码挡在门外。
- 策略只在校验阶段生效:创建用户、
ALTER USER、SET PASSWORD都会触发 - 它不管你是 root 还是普通用户,也不区分本地/远程连接,一视同仁
- 策略对已存在的弱密码无效——只管“改”和“新建”,不追溯旧账
- 若用户绕过策略(比如用哈希值直写
authentication_string),必须先UNINSTALL PLUGIN validate_password,否则 UPDATE 会被拒绝
快速启用并调低策略(开发/测试环境常用)
很多新手卡在刚装完 MySQL 8.0 就连不上,就是因为默认 validate_password_policy = MEDIUM 拒绝了简单密码。临时救急可这样操作:
- 确认插件是否加载:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password'; - 若未启用,安装:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 立即降低要求(重启后失效):
SET GLOBAL validate_password_policy = LOW;和SET GLOBAL validate_password_length = 6; - 再执行密码修改:
ALTER USER 'test'@'localhost' IDENTIFIED BY '123456';
⚠️ 注意:LOW 策略只检查长度,不校验大小写/数字/特殊字符;但即使设成 LOW,validate_password_length 默认仍是 8,所以必须显式设为 6 才能用 6 位密码。
让策略永久生效:必须写进配置文件
SET GLOBAL 修改只在当前实例生命周期内有效,MySQL 重启后还原。生产环境务必写入 my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段:
系统设置:密码修改 增加用户(权限) [打印机设置 票样打印设置 这2块用不着实现系统界面上 放着就好了]基础设置:基础参数设置(买票设置/订票设置/退票设置)(比如多少时间之前不能买票订票) 车票设置(标准票/儿童票/。。。增删改) 车辆设置(增删该) 车次设置(增删该) 运营计划设置(调度设置)前台营业:销售车票
[mysqld] validate_password_policy=STRONG validate_password_length=12 validate_password_mixed_case_count=2 validate_password_number_count=2 validate_password_special_char_count=2 validate_password_check_user_name=ON
✅ 这样重启后仍生效;❌ 不要漏掉 validate_password_check_user_name=ON,否则用户 'admin' 设密码 'admin123!' 也能通过——因为策略默认不检查用户名相似性。
想彻底禁用?可以,但别长期开着
某些老旧系统集成脚本硬编码了弱密码,实在无法改代码时,可临时卸载插件:
- 禁用:
UNINSTALL PLUGIN validate_password; - 此时
ALTER USER 'xxx'@'%' IDENTIFIED BY '123'就能成功 - 用完立刻恢复:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
⚠️ 生产环境长期关闭等于裸奔:没有策略时,root 被设成 'password' 或空密码都无人拦截。更危险的是,一旦卸载插件,所有依赖它的参数(如 validate_password_length)将从 SHOW VARIABLES 中消失,后续 SET GLOBAL 会报错 Unknown system variable —— 很容易让人误以为“策略还在但没生效”。









