MySQL 8.0 默认使用 caching_sha2_password 插件,旧版连接工具(如 Navicat 12、DBeaver 7.x、PyMySQL<1.0)因不支持该插件,在握手第一阶段即断连,报错如“2059”或“plugin cannot be loaded”,本质是协议不匹配而非密码错误。

MySQL 8.0 默认用 caching_sha2_password,旧版连接工具(如 Navicat 12、DBeaver 7.x、PyMySQL
怎么确认是不是 caching_sha2_password 搞的鬼
登录 MySQL 命令行后直接查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果 plugin 列显示 caching_sha2_password,且你用的是老 GUI 工具或旧驱动,基本就是它。注意三点:
-
host必须精确匹配:连的是'root'@'127.0.0.1',就不能只改'root'@'localhost' - 云数据库(如阿里云 RDS)通常禁写配置文件,
ALTER USER是唯一路径 - 某些客户端(如 Navicat)会缓存握手参数,改完服务端必须关掉重开,否则还在用旧流程重试
ALTER USER 切插件时最常踩的坑
只写 IDENTIFIED WITH mysql_native_password 不带密码,会导致密码被清空;只重设密码不指定插件,plugin 字段不变——两者必须同时做。
正确写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
改完必须执行:
FLUSH PRIVILEGES;
常见疏漏点:
- 用
127.0.0.1连(Navicat 默认行为),还得单独处理'root'@'127.0.0.1' - 密码含
@、/、!等字符时,命令行连接要加单引号:mysql -uroot -p'pass!@#' -
my.cnf里配default_authentication_plugin = mysql_native_password只影响新用户,对已有用户完全无效
为什么改了配置重启还是连不上
因为 default_authentication_plugin 配置项只控制新建用户的默认插件,不会批量更新已存在用户的 plugin 字段。哪怕你重启了 mysqld,root、app_user 这些老账户依然维持原 plugin 值。
更麻烦的是,MySQL 8.4+ 已弃用该配置项,改用 authentication_policy;部分云服务甚至直接屏蔽配置修改入口,此时 ALTER USER 是唯一可行手段。
驱动和连接参数不配齐,切了插件也白搭
即使服务端已切回 mysql_native_password,Java 应用仍可能卡在握手阶段,因为驱动版本或 URL 参数没跟上:
- JDBC 驱动必须是
mysql-connector-java-8.0.x.jar(如 8.0.33),不能用 5.x 或早期 8.0.x) - .NET 的
MySql.Data要 ≥ v8.0.28,且需显式启用 SSL 或允许公钥检索 - PyMySQL 必须 ≥ v1.0,旧版即使看到
mysql_native_password也可能因内部逻辑缺陷拒绝连接
真正容易被忽略的,往往不是插件切换本身,而是 host 写 localhost 却没同步改 'root'@'localhost',或者密码里的特殊字符被 URL 解析吃掉——这些细节比插件类型更常导致失败。


















