根本原因是客户端不支持caching_sha2_password插件,需用ALTER USER将用户认证插件改为mysql_native_password并执行FLUSH PRIVILEGES。

不是密码错了,是客户端压根不认识 caching_sha2_password 这个插件——它在 TCP 连接建立后的认证握手第一轮就直接断开,报错像 ERROR 2059、Authentication plugin 'caching_sha2_password' cannot be loaded 或 Navicat 提示 “Access denied” 却确认密码无误。最稳的解法是用 ALTER USER 把目标用户切回 mysql_native_password,并立刻执行 FLUSH PRIVILEGES。
怎么确认真是 caching_sha2_password 在报错
别靠错误信息猜。用还能连上的账号(比如本地 root)登录 MySQL 命令行,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果显示 caching_sha2_password,且你用的是以下任一情况,基本就是它:
- Navicat ≤ v15(尤其是 v12/v14)
-
mysql-connector-java:5.1.x或8.0.15- -
PyMySQL < 1.0.2或mysqlclient < 2.0 - PHP 7.3 及更早 +
mysqli未启用get_server_public_key=1
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, plugin FROM mysql.user WHERE user = 'your_user';,逐条核对 - 改本地 socket 连接:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_actual_password'; - 改本机 TCP 连接(Navicat 默认):
ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_actual_password'; - 改远程连接:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_actual_password'; - 漏掉
@'host'会报ERROR 1396,说明用户不存在,得先CREATE USER
改完不 FLUSH PRIVILEGES 就等于没改
MySQL 8.0.16+ 权限缓存更严格,ALTER USER 只改元数据,不自动刷新内存中的认证状态。
- 必须紧跟着执行:
FLUSH PRIVILEGES; - 宝塔、phpEnv 等面板环境,改完后还需手动重启 MySQL 服务,否则连接池可能继续复用旧认证状态
- Navicat 不会自动感知变更,必须关闭软件重开,或删掉旧连接重建(它缓存握手参数)
- 云数据库(如阿里云 RDS)禁写
/etc/my.cnf,ALTER USER是唯一入口
最容易被忽略的点是:host 不匹配和漏掉 FLUSH PRIVILEGES。哪怕密码、SQL 语法全对,只要查错了一行 user/host 组合,或者没刷权限,连接照样失败。



















