答案是确认插件不匹配:登录MySQL命令行执行SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';若plugin列为caching_sha2_password,且客户端为Navicat 15以下或PyMySQL等旧版驱动,则确因认证插件不兼容导致ERROR 2059。

连不上不是密码错了,也不是网络不通,而是客户端根本不认识 caching_sha2_password 这个插件——它卡在 TCP 握手后的认证阶段,报错类似 ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded。
怎么确认真是这个插件惹的祸
先用能连上的方式(比如 mysql -u root -p 本地 socket)登录 MySQL 命令行,执行:
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'是两个独立用户,必须分别查、分别改 - Navicat 默认走
127.0.0.1,不是localhost,很多人只改了后者却连不上 - 云数据库(如阿里云 RDS)可能禁止直接查
mysql.user,但ALTER USER通常仍可用
ALTER USER 改认证插件必须带密码
只写 IDENTIFIED WITH mysql_native_password 不行,会清空密码,导致账户锁死。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 改本地连接:
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再改
my.cnf 里设 default_authentication_plugin 没用?没错
default_authentication_plugin = mysql_native_password 只影响「之后新建的用户」,对已存在的 root、admin 等完全无效。
- Docker 启动加
--default-authentication-plugin=mysql_native_password同样不修复存量用户 - 云服务(RDS/CDB)通常禁写配置文件,这条路走不通
- 重启 MySQL 不会让老用户自动切换插件,
FLUSH PRIVILEGES也不管这事 - 有人改完配置就以为搞定,结果还是连不上——因为
plugin字段没变
Navicat / JDBC / PyMySQL 连不上?别只盯服务端
服务端改完,客户端也得配合,否则照样失败。
- Navicat:必须关闭重开软件,或删掉旧连接重建;它会缓存握手参数,不刷新就重试旧流程
- JDBC:驱动至少用
mysql-connector-java 8.0.16+,连接串加?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC - PyMySQL:升级到 ≥1.0.2,并显式传参
auth_plugin='caching_sha2_password' - 命令行客户端:
mysql --default-auth=mysql_native_password -u root -p只影响当前命令,图形工具完全不认这个参数 - 密码含
@、/等特殊字符时,URL 解析可能吃掉一部分——这不是插件问题,但更常导致失败
真正麻烦的不是哪条 SQL 怎么写,而是整个链路中任意一环卡在旧协议上:宿主机客户端版本、容器内应用驱动、云厂商 LB 的 TLS 终止、甚至 Navicat 缓存的连接模板——这些细节比插件切换本身更常被忽略。


















