Navicat报错2059或1251表明客户端与MySQL 8.0默认的caching_sha2_password认证插件不兼容,本质是SHA-256新协议与旧版SHA-1客户端握手失败;需执行ALTER USER切换插件、FLUSH PRIVILEGES刷新权限、针对实际连接host(如'root'@'127.0.0.1')操作,并彻底重启Navicat。

Navicat 报错 2059 或 1251 是什么信号
这不是密码错了,也不是服务没起来,而是 Navicat(尤其是 12 及更早版本)压根不认 MySQL 8.0 默认的 caching_sha2_password 插件。服务器说“我只用 SHA-256 安全握手”,客户端还在用老式 SHA-1 协议回应,双方语言不通,直接断连。
ALTER USER 切换插件后仍连不上,常见漏掉的点
执行了 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx',但 Navicat 还是报错,问题往往出在这些地方:
-
FLUSH PRIVILEGES没执行——认证插件变更存在mysql.user表里,不刷缓存不会生效 - 只改了
'root'@'localhost',但 Navicat 实际走的是 TCP 连接(即'root'@'127.0.0.1'或'root'@'%'),这两个 host 是独立用户,必须分别处理 - Navicat 缓存了旧连接池或预加载的握手协议,改完插件后必须完全关闭并重启 Navicat,不能只点“重试连接”
- 宝塔、Docker 等环境里,MySQL 容器或服务可能没读到你修改的配置,或挂载了旧
my.cnf,得确认容器内SELECT @@version, @@default_authentication_plugin;的输出
Java/Python 应用连不上,光改插件还不够
即使服务端已切回 mysql_native_password,应用仍卡在 handshake 阶段,大概率是驱动或参数不匹配:
- Java 用 MySQL Connector/J 8.0+ 驱动时,连接串缺
?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC——其中allowPublicKeyRetrieval=true是绕过 RSA 密钥交换的必需开关 - 若还在用 5.1.x 驱动,它根本不认识
caching_sha2_password,也不支持allowPublicKeyRetrieval参数,必须升级驱动 - Python 项目若用
pymysql,需确保版本 ≥ 1.0.2;用mysqlclient则需 ≥ 2.0.0,否则仍会 fallback 到不兼容路径
云数据库(如阿里云 RDS)不能直接改插件怎么办
阿里云、腾讯云等平台通常屏蔽 ALTER USER ... IDENTIFIED WITH 和 default_authentication_plugin 配置,执行会报错或静默忽略。此时只能:
- 在控制台找“兼容模式”或“旧版认证方式”开关(部分新版 RDS 已提供)
- 创建新账号时指定认证插件:
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';—— 有些云厂商允许对新建用户设插件,但已有用户(如 root)不可改 - 彻底放弃降级插件,改用支持
caching_sha2_password的客户端:Navicat ≥ 12.1、DBeaver ≥ 7.0、JDBC 驱动 ≥ 8.0.19,这才是长期解法
真正容易被忽略的是 host 匹配粒度和客户端缓存行为——localhost 和 127.0.0.1 在 MySQL 权限系统里是两个用户,而 Navicat 默认走 TCP,不是 socket;改完插件不关软件重开,它就永远记着旧握手方式。


















