mysql 8.0默认使用caching_sha2_password插件导致旧客户端连接失败,因协议不兼容而卡在握手第一阶段;需通过select确认plugin值,再用alter user指定插件与密码并flush privileges,注意host精确匹配及客户端重启。

不是密码改错了,是 MySQL 8.0 默认用 caching_sha2_password 插件认证,而旧版客户端(比如 Navicat 12、PyMySQL mysqli 7.3)压根不认识它——连接在 TCP 握手第一阶段就断了,根本没走到密码校验环节。
怎么确认真是 caching_sha2_password 搞的鬼
登录 MySQL 命令行后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果 plugin 列显示 caching_sha2_password,且你用的是老客户端或旧驱动,基本就是它。注意三点:
-
host必须完全匹配:连的是'root'@'127.0.0.1',就不能只查或只改'root'@'localhost' - 错误提示里带
Authentication plugin 'caching_sha2_password' cannot be loaded或Client does not support authentication protocol,可直接锁定 - 云数据库(如阿里云 RDS)通常禁写配置文件,
SELECT是唯一快速验证手段
ALTER USER 切插件时最容易锁死自己的操作
这条语句看着简单,漏掉任意一项都会失败甚至清空密码:
- 必须同时指定插件和密码:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd';—— 只写IDENTIFIED WITH mysql_native_password不加BY,原密码会被清空 - 改完必须执行:
FLUSH PRIVILEGES;,某些 Docker 环境或 phpEnv 下不执行就不生效 - 如果你用 Navicat 默认的
127.0.0.1连,就得单独处理'user'@'127.0.0.1',不能只改localhost - 密码含
@、/、!等字符时,命令行连接要加单引号:mysql -u user -p'pass!@#'
为什么改了 my.cnf 的 default_authentication_plugin 还是连不上
因为这个配置项只影响「新创建的用户」,对已存在的 root、app_user 等完全无效。即使你加了:
[mysqld] default_authentication_plugin = mysql_native_password
重启后 SHOW VARIABLES LIKE 'default_authentication_plugin'; 显示变了,但老用户的 plugin 字段还是 caching_sha2_password。云数据库(RDS/CDB)通常还屏蔽该配置,改了也白改。
客户端侧参数不配齐,切了插件也白搭
服务端已切回 mysql_native_password,Java 应用仍握手失败?大概率是驱动或连接参数没跟上:
- JDBC 必须用
mysql-connector-java-8.0.x(如 8.0.33),5.1.x 驱动根本不识别新协议 - 连接串必须加:
?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC—— 少一个都可能卡在 RSA 密钥交换阶段 - Navicat 等 GUI 工具会缓存握手参数,改完服务端必须关掉重开,否则还在用旧流程重试
真正容易被忽略的,不是插件切换本身,而是 host 匹配精度、客户端缓存、以及密码特殊字符在命令行或 URL 中被截断——这些细节比 SQL 语句更常导致失败。











