根本原因是客户端不支持caching_sha2_password插件,需执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并立即FLUSH PRIVILEGES;须先查SELECT user, host, plugin FROM mysql.user确认目标用户plugin值,注意localhost、127.0.0.1和%是独立账号。

直接结论:不是密码错了,也不是连不上数据库,是客户端压根不认识 caching_sha2_password 这个插件——它在 TCP 连接建立后、认证握手第一轮就直接断开。最稳的解法是执行 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 ≤ 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
典型错误包括:Authentication plugin 'caching_sha2_password' cannot be loaded、ERROR 2059、或 Navicat 提示 Access denied for user 但密码确定没错。
ALTER USER 必须写全 'user'@'host',不能只写用户名
MySQL 把 'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 当作三个完全独立的用户。Navicat 默认走 127.0.0.1(TCP),不是 localhost(socket),很多人只改了后者却连不上。
实操要点:
- 必须显式重设密码:
ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_actual_password';—— 省略BY子句会清空密码,账户锁死 - 漏掉主机名(比如只写
'your_user')会报错ERROR 1396,说明用户不存在,得先CREATE USER -
'repl_user'@'192.168.1.10'和'repl_user'@'%'是两个账号,主从同步失败时必须查准 host 再改
改完不 FLUSH PRIVILEGES 就等于没改
MySQL 8.0.16+ 权限缓存更严格,ALTER USER 只改元数据,不自动刷新内存中的认证状态。
必须紧跟着执行:
FLUSH PRIVILEGES;
额外注意:
- 宝塔、phpEnv 等面板环境,改完后还需手动重启 MySQL 服务,否则连接池可能继续复用旧认证状态
- Navicat 不会自动感知变更,必须关闭软件重开,或删掉旧连接重建(它缓存握手参数)
- 云数据库(如阿里云 RDS)禁写
/etc/my.cnf,ALTER USER是唯一有效入口
真正麻烦的不是命令本身,而是漏写 host、忘记 FLUSH PRIVILEGES、或者误以为改了配置文件就能一劳永逸——default_authentication_plugin=mysql_native_password 只影响新创建的用户,对已有账号完全无效。



















