确认问题根源需先查询:select user, host, plugin from mysql.user where user = 'your_user';,若plugin列为caching_sha2_password,且使用navicat 15以下或pymysql等不兼容客户端,即为该插件导致连接失败。

怎么确认真是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'、'root'@'127.0.0.1'、'root'@'%'是三个独立账号,必须分别查、分别处理 - Navicat 默认走 TCP 连接,即
127.0.0.1,不是localhost;很多人只改了后者,结果还是连不上 - 云数据库(如阿里云 RDS)可能禁止直接查
mysql.user,但ALTER USER通常仍可用
ALTER USER改认证插件必须带密码
这是最常用也最容易翻车的操作。漏掉密码,账号直接锁死:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
- 改本地 socket 连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改本机 TCP 连接(Navicat 默认):
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改远程访问:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改完立刻执行:
FLUSH PRIVILEGES;,否则内存缓存不更新,新设置无效 - 如果提示
ERROR 1396,说明该用户不存在,得先CREATE USER再改
客户端驱动也得对齐,光改服务端没用
服务端切到 mysql_native_password 后,客户端还得配合,否则照样失败:
- 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 客户端版本 ≠ 容器内应用所用驱动版本,要分别检查
Navicat 缓存旧配置,改完不重启等于白改
这是最容易被忽略的一环:Navicat 会把连接参数(包括认证方式)缓存在内存和配置文件里。
- 改完服务端后,必须完全退出 Navicat,再重新打开
- 或者删掉旧连接,新建一个——不能点“编辑”后点“测试”,它可能还在用旧握手参数重试
- 如果密码含
@或/,URL 解析会出错;建议在 Navicat 连接配置中勾选“使用密码加密”或改用更安全的字符 - my.cnf 里的
default_authentication_plugin只影响新用户,对已有账号完全无效;重启 MySQL 也不会自动切换老用户的插件










