mysql 5.7.5起old_passwords参数已被彻底移除,无法设置为0或1;mysql_old_password插件、old_password()函数一并删除,secure_auth强制启用,所有账户必须使用4.1+密码格式。

old_passwords 参数在现代 MySQL 中已不可设置为 0 或 1,强行配置会失败。这不是操作遗漏,而是 MySQL 自身的硬性限制 —— 从 MySQL 5.7.5 开始,该参数已被彻底移除。
old_passwords=0 在 MySQL 5.7.5+ 上根本无效
你执行 SET GLOBAL old_passwords = 0 或在 my.cnf 的 [mysqld] 段里写 old_passwords=0,MySQL 启动时会直接报错或静默忽略,且 SHOW VARIABLES LIKE 'old_passwords' 查不到这个变量。
- MySQL 5.7.5 及以后:
-
mysql_old_password插件被删除 -
OLD_PASSWORD()函数被删除 -
secure_auth强制启用(无法关闭) - 所有账户必须使用 4.1+ 密码格式(即 41 字符哈希),且
plugin字段不能为空
-
所以,“禁用旧版身份验证”的动作,不是靠设 old_passwords=0,而是靠确保账户不走旧插件、不用旧哈希。
怎么确认一个用户还在用不安全的旧认证?
检查 mysql.user 表中对应用户的两个字段:
-
Password列值长度是否为 16 字符(如1234567890123456)?→ 是 pre-4.1 旧哈希 -
plugin列值是否为mysql_old_password?→ 已在 5.7+ 中被移除,若存在说明是升级残留或低版本 dump 导入
执行这条语句可定位风险账户:
SELECT User, Host, LENGTH(authentication_string) AS hash_len, plugin FROM mysql.user WHERE LENGTH(authentication_string) = 16 OR plugin = 'mysql_old_password';
只要结果非空,就存在兼容性隐患。
🎯 HR面试评价助手(Word版格式) 生成可直接复制到Word文档的标准格式HR面试评价 【使用方式】 1. 发送口令:HR面试评价 2. 粘贴JD文字 3. 上传简历文档 4. 上传面试记录(可选) 5. 复制生成的评价到Word 【输出特点】 - 纯文本格式,可直接粘贴到Word - 层次清晰,标题加粗...
如何真正停用旧认证(MySQL 5.7+ 实操)
你不能“禁用”一个已不存在的东西,但可以清除残留、强制刷新为安全格式:
-
使用
ALTER USER重置密码(推荐):ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'newpass';
这会同时更新authentication_string(生成 41 字符 SHA1 哈希)和plugin字段。 -
若遇到
ERROR 1396 (HY000): Operation ALTER USER failed...,说明用户plugin为空或非法,先补全插件再改密:UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'username' AND Host = 'host'; FLUSH PRIVILEGES;
然后再执行ALTER USER。 不要用
SET PASSWORD或UPDATE mysql.user SET authentication_string = PASSWORD('xxx'):PASSWORD()函数在 8.0+ 已废弃,5.7.6+ 起默认返回 NULL;且它不更新plugin字段,容易埋雷。
容易被忽略的关键点
- 即使你没手动设过
old_passwords,只要数据库是从 MySQL 5.1/5.5 升级上来,且未批量刷新过用户密码,mysql.user表里就可能躺着 16 字符哈希的账户 —— 它们在 5.7.5+ 启动时会被自动禁用,但不会报错,只会在连接时拒绝认证。 -
mysqld_exporter、Percona Toolkit等工具连不上,往往不是账号密码错,而是账号本身已被 MySQL 服务端“逻辑下线”。 - MySQL 8.4 起,
mysql_native_password插件默认不加载,即使你把用户设成这个插件,也会连不上 —— 那是另一个问题,需显式启用插件,而非调old_passwords。
真正的安全边界不在参数开关,而在 mysql.user.plugin 和 authentication_string 的实际取值。










