根本原因是客户端不支持caching_sha2_password握手协议,需用SELECT确认用户plugin值,若为caching_sha2_password且客户端较旧(如Navicat 15以下、PyMySQL等),则必须执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。

连不上不是密码错了,是客户端根本“听不懂”caching_sha2_password的握手协议——它要求 RSA 公钥交换或 TLS,而 Navicat 15 以下、PyMySQL、旧版 JDBC 驱动等压根不支持。最直接有效的解法,是改用户认证插件,不是调配置文件。
怎么确认真是 caching_sha2_password 在报错
别猜,用还能连上的账号(比如 mysql -u root -p)进命令行,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果值是 caching_sha2_password,且你遇到以下任一现象,基本就锁定了问题:
-
ERROR 2059 (HY000)或Authentication plugin 'caching_sha2_password' cannot be loaded - Navicat 12–14、DBeaver 7.x 或更早版本连接中断无提示
- PyMySQL 报
Client does not support authentication protocol - JDBC 抛
java.sql.SQLException: Unable to load authentication plugin
注意:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个独立账号,必须分别查、分别处理。
ALTER USER 切换插件必须带密码重写
语法漏掉 BY 'pwd' 是最高频致命错误——它会清空密码,导致账号不可用。正确写法必须三要素齐全:
- 显式指定
host:Navicat 默认走 TCP,大概率连的是'user'@'127.0.0.1',不是'user'@'localhost' - 必须用
IDENTIFIED WITH mysql_native_password BY 'real_password',不能只写IDENTIFIED WITH mysql_native_password - 哪怕原密码没变,也得重写一遍;否则 MySQL 会认为你要清空密码
示例(改本地 TCP 连接):
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';
改完立刻执行:
FLUSH PRIVILEGES;
否则内存缓存不更新,新设置完全无效。
为什么改 my.cnf 的 default_authentication_plugin 没用
这个配置项只影响「之后新建的用户」,对已存在的 root、应用账号、复制账号完全无效。很多人改完 /etc/my.cnf 就重启 MySQL,结果 Navicat 还是连不上——因为旧用户元数据根本没被碰过。
云数据库(如阿里云 RDS)、宝塔、phpEnv 等环境通常禁写配置文件,这条路根本走不通。--default-authentication-plugin=mysql_native_password 这类启动参数也只作用于当前客户端进程,不影响 Navicat、Java 应用或 Python 脚本里的驱动。
真正容易被忽略的细节是:Navicat 和 DBeaver 会缓存连接配置,改完服务端后不关软件重开、不删旧连接重建,它可能还在用旧握手参数反复重试;PHP 连接时若含 @ 或 / 的密码,还可能被 URL 解析吃掉——这些比插件切换本身更常导致失败。










