navicat连接mysql报错1251或2059,本质是客户端不支持caching_sha2_password认证插件,需用alter user切换为mysql_native_password并刷新权限,且必须匹配user@host、显式重写密码、重启navicat生效。

连不上不是密码错了,是客户端根本“听不懂”caching_sha2_password插件的握手协议——它要求 RSA 公钥交换或 TLS 加密,而旧版 Navicat、PyMySQL、JDBC 5.1.x 等工具协议栈缺失,直接在认证阶段就断开。
怎么确认真是 caching_sha2_password 在报错
别靠错误信息猜。用还能连上的账号(比如 mysql -u root -p)执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看三列:
-
plugin列值为caching_sha2_password就坐实问题 -
user和host必须完全匹配你连接字符串里的值——'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%'是三个独立账号,漏查一个都白忙 - 典型错误包括:
ERROR 2059、Authentication plugin 'caching_sha2_password' cannot be loaded、Unable to load authentication plugin
ALTER USER 切换插件必须带密码重写
语法错一步就锁死账号。必须严格按格式执行,不能省略 BY 子句:
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';
常见坑点:
-
'app_user'@'localhost'和'app_user'@'127.0.0.1'是两个账号,Navicat 默认走后者,只改localhost没用 - 哪怕原密码没变,也必须显式重写;漏掉
BY 'xxx'会导致密码哈希被清空,账户立即不可用 - 执行完必须紧跟
FLUSH PRIVILEGES;,否则内存权限缓存不更新,重启 MySQL 也无效 - 宝塔、phpMyAdmin 界面里点“编辑”常无法修改
plugin字段,必须进 SQL 标签页手动执行
客户端驱动和工具也要对齐
只改服务端还不够,老版本客户端可能仍握手失败:
- JDBC 连接串需加参数:
allowPublicKeyRetrieval=true&useSSL=false(仅限内网可信环境),且驱动版本至少为mysql-connector-java:8.0.16 - PyMySQL 必须 ≥1.0.2 才原生支持
caching_sha2_password;低于此版本要么升级,要么换mysql-connector-python - Node.js 的
mysql2需显式传参authPlugin: 'caching_sha2_password',且版本 ≥2.0.0 - Navicat 12 及更早版本不支持该插件,必须改服务端插件或升级到 Navicat 15+
为什么改 my.cnf 的 default_authentication_plugin 没用
这个配置项只影响「之后新建的用户」,对已存在的 root、repl_user、应用账号等完全无效。很多人改完 [mysqld] 段就重启,发现插件字段还是 caching_sha2_password,就是因为 MySQL 不会自动迁移存量用户元数据。
云数据库(如阿里云 RDS)通常禁止写 /etc/my.cnf,这条路根本走不通;Docker 启动参数 --default-authentication-plugin=mysql_native_password 同样只管新用户,不修复已有账号。真正容易被忽略的是:Navicat 会缓存连接配置,改完服务端后不关软件重开、不删旧连接重建,它可能还在用旧握手参数反复重试——host 写 localhost 却没同步改 'root'@'localhost',或者密码含 @、/ 被 URL 解析吃掉,这些细节比插件切换本身更常导致失败。










