根本原因是客户端不支持caching_sha2_password认证插件,需通过show variables和select mysql.user确认插件类型,并对'your_user'@'127.0.0.1'等具体host执行alter user切换为mysql_native_password,再flush privileges且重启客户端。

报错不是密码错了,也不是网络不通,是客户端根本没能力解析 caching_sha2_password 握手协议——它在 TCP 连上后、发密码前就直接断开了。
怎么确认真是 caching_sha2_password 在报错
别靠错误信息猜。用还能连上的账号(比如 root 本地登录)进 MySQL 命令行,执行:
SHOW VARIABLES LIKE 'default_authentication_plugin';<br>SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看第二条结果的 plugin 列。如果显示 caching_sha2_password,且你用的是以下任一组合,基本就是它:
- Navicat ≤15(尤其是 12/14)、SQLyog 等老 GUI 工具
- JDBC 驱动是
mysql-connector-java:5.1.x - Python 用
pymysql 或 <code>mysqlclient - PHP 7.3 及更早 +
mysqli扩展未启用或版本太旧
典型错误信息包括:Authentication plugin 'caching_sha2_password' cannot be loaded、Unable to load authentication plugin、或连接时静默中断无提示。
ALTER USER 切认证插件必须写全 'user'@'host'
MySQL 把 'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 当作三个完全独立的用户。Navicat 默认走 127.0.0.1(TCP),不是 localhost(socket),漏掉就白改。
- 先查清楚目标用户有哪些 host:
SELECT user, host FROM mysql.user WHERE user = 'your_user'; - 改本地 socket 连接:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改 TCP 连接(Navicat 默认):
ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改远程访问:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果密码不变,可省略
BY子句,但IDENTIFIED WITH必须完整:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password; - 语法错一点就报错:
IDENTIFIED BY单独出现会失败,必须是IDENTIFIED WITH plugin_name [BY 'pwd']
改完必须立刻 FLUSH PRIVILEGES,且客户端要重启
这条命令不是可选的——不执行,变更只存在内存里,服务端根本不认。
- 执行完立刻跟一句:
FLUSH PRIVILEGES; - Navicat 会缓存握手参数,不关软件重开,或删掉旧连接重建,它还在用旧方式重试
- 宝塔面板用户别在 phpMyAdmin 的“编辑”表单里点保存——
plugin字段常被设为只读,必须进 SQL 标签页手写ALTER USER - 云数据库(如阿里云 RDS)禁写
/etc/my.cnf,ALTER USER是唯一可行入口
最容易被忽略的,不是 SQL 写错,而是查了 'user'@'localhost' 就以为搞定了,却忘了 'user'@'127.0.0.1' 这个 Navicat 实际连的账号;或者密码里含 @、/ 被 URL 解析吃掉,导致连接串失效。











