答案是确认插件不匹配:登录MySQL命令行执行SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';若plugin列为caching_sha2_password,且客户端为Navicat≤15、PyMySQL

不是密码错了,也不是网络不通,是客户端压根没能力解析 caching_sha2_password 握手协议——它在 TCP 连上后、发密码前就直接断开了。
怎么确认真是 caching_sha2_password 搞的鬼
别靠错误信息猜。用还能连上的账号(比如 root 本地登录)进 MySQL 命令行,执行:
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 用
pymysqlmysqlclient - 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:
中文 Word 文档自动化校对工具。当用户需要对中文文本或 Word 文档进行标点符号检查、语法检查、错别字检查时使用此 skill。触发词:语法检查、错别字、标点符号、校对、检查文档。
SELECT user, host FROM mysql.user WHERE user = 'your_user';
再分别执行(注意替换实际用户名、密码和 host):
- 改本地 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';
语法错一点就报错:IDENTIFIED BY 单独出现会失败,必须是 IDENTIFIED WITH plugin_name [BY 'pwd']。
改完不 FLUSH PRIVILEGES 就等于没改
这条命令不是可选的——不执行,变更只存在内存里,服务端根本不认。
执行完立刻跟一句:
FLUSH PRIVILEGES;
然后必须重启客户端:Navicat 要关掉重开,或删掉旧连接重建;JDBC 应用要重启进程;Docker 容器得重建或 reload 连接池。否则它还在用旧握手参数重试。
特别容易被忽略的是:云数据库(如阿里云 RDS)禁写 /etc/my.cnf,default_authentication_plugin 配置只影响新建用户,对已有用户完全无效——ALTER USER 是唯一入口。


















