MySQL 8.0+ 默认禁用 mysql_native_password 插件但未移除,需显式用 ALTER USER ... IDENTIFIED WITH mysql_native_password 切换;仅用 IDENTIFIED BY 不改变插件,旧客户端因不支持 caching_sha2_password 而报“not loaded”实为协议不兼容。

MySQL 8.0 不是“不支持” mysql_native_password,而是默认不再启用它——该插件仍存在、可加载、能用,但被主动降权。真正的问题在于:服务端没开、客户端连不上、用户没切,三者叠加导致连接失败。
为什么 ALTER USER ... IDENTIFIED BY 无法切换认证插件
这条命令在 MySQL 8.0+ 中默认沿用用户当前的 plugin 字段值,不会自动降级到 mysql_native_password。
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';后,SELECT user, host, plugin FROM mysql.user查出来仍是caching_sha2_password - 必须显式写明插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; - 如果用户已存在且插件是
caching_sha2_password,只改密码哈希(如用SET PASSWORD)完全无效
为什么 my.cnf 里加 default_authentication_plugin 没生效
配置项位置或版本兼容性出错是最常见原因。
-
default_authentication_plugin必须放在[mysqld]段下,写在[client]或[mysql]段无效 - MySQL 8.4+ 已弃用
default_authentication_plugin,应改用authentication_policy=mysql_native_password - 改完配置必须完整重启 MySQL(
systemctl restart mysqld),FLUSH PRIVILEGES或reload不起作用 - 云数据库(如阿里云 RDS)通常禁止修改
my.cnf,这条路直接走不通
为什么 Navicat / PHP / PyMySQL 连接时提示 “plugin not loaded”
错误信息里的 “not loaded” 是误导性表述——实际是客户端根本不认识这个插件名,不是服务端没加载。
中文 Word 文档自动化校对工具。当用户需要对中文文本或 Word 文档进行标点符号检查、语法检查、错别字检查时使用此 skill。触发词:语法检查、错别字、标点符号、校对、检查文档。
- Navicat v12 及更早版本内嵌的
libmysqlclient基于 OpenSSL 1.0.2,而caching_sha2_password要求 OpenSSL 1.1.1+,握手阶段就失败 - PyMySQL caching_sha2_password;升级后仍报错,说明驱动没走对协议分支
- PHP 的
mysqlnd扩展在 PHP 7.4 之前基本不支持新插件,仅靠改 MySQL 配置无法绕过 - 某些旧工具(如老版 MySQL Workbench)甚至不尝试协商插件,直接按
mysql_native_password协议发包,服务端拒绝后才报错
哪些操作看似有效实则埋雷
这些做法短期能连上,但容易在后续维护中翻车。
- 只改
my.cnf却不ALTER USER:新用户能用mysql_native_password,但已有用户(尤其是root)仍卡在caching_sha2_password - 用
CREATE USER时指定插件,但忘了给用户赋权:GRANT和plugin是两件事,缺一不可 - 在 Docker 容器里改了配置却没重建容器,或挂载配置文件路径错误,导致配置根本没进容器
- 误以为
mysql_native_password=ON是开关指令——它只是允许加载,并不强制启用;真正起效的是authentication_policy或IDENTIFIED WITH
最常被忽略的一点:插件切换是 per-user 的,不是全局开关。哪怕你把整个服务器都设成 mysql_native_password,只要 SELECT user, host, plugin FROM mysql.user 里还有一行是 caching_sha2_password,那个用户就还是连不上旧客户端。










