根本原因是客户端不支持caching_sha2_password插件,导致握手阶段直接拒连;需先用SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'确认目标用户plugin值,若为caching_sha2_password且客户端版本较低(如Navicat 15以下、PyMySQL等),则应修改该用户认证方式为mysql_native_password。

连不上不是密码错了,是客户端根本不认识 caching_sha2_password 这个插件——它在握手阶段就直接拒连,报错像 ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded。最稳的解法是改用户认证方式,而不是碰全局配置。
怎么确认真是 caching_sha2_password 搞的鬼
先用能连上的方式(比如 mysql -u root -p 本地登录)查清楚目标用户实际用的是哪个插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果显示 caching_sha2_password,且你用的是 Navicat 15 以下、PyMySQL
-
'root'@'localhost'(socket 连接) -
'root'@'127.0.0.1'(TCP 连接,Navicat 默认走这个) -
'root'@'%'(远程连接)
得分别查、分别改,漏一个都白干。
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
ALTER USER 改单个用户的实操要点
这是见效最快、影响最小的操作,但容易踩坑:
- 必须显式重设密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';—— 只写IDENTIFIED WITH mysql_native_password不带BY,会清空密码,账户直接锁死 - 改完立刻执行:
FLUSH PRIVILEGES;,否则不生效 - Navicat 会缓存旧连接配置,改完服务端后必须关掉软件重开,或删掉旧连接重建,否则它还在用旧握手参数重试
- 云数据库(如阿里云 RDS)禁写
/etc/my.cnf,这条路根本不可行,ALTER USER是唯一入口
JDBC、PyMySQL、Node.js 等代码连接失败怎么办
不能只改服务端,客户端驱动也得对齐:
- JDBC URL 必须加
allowPublicKeyRetrieval=true&useSSL=false(仅限内网可信环境),驱动版本至少8.0.16;低于此版本即使加参数也可能失败 - PyMySQL ≥1.0.2 才原生支持
caching_sha2_password,旧版要么升级,要么换mysql-connector-python - Node.js 的
mysql2需显式传参authPlugin: 'caching_sha2_password',且版本 ≥2.0.0 - Docker 场景下,宿主机 MySQL 客户端版本 ≠ 容器内应用所用驱动版本,要分别检查
最容易被忽略的不是 SQL 语句写错,而是 host 写成 localhost 却没同步处理 'root'@'localhost',或者密码里含 @、/ 被 URL 解析吃掉——这些细节比插件切换本身更常导致失败。


















