mysql 8.0 连不上主因是客户端不支持 caching_sha2_password 插件,需执行 alter user 'user'@'host' identified with mysql_native_password by 'pwd' 并 flush privileges;注意 root@localhost 与 root@127.0.0.1 需分别处理,且必须显式重设密码。

MySQL 8.0 连不上,大概率不是密码错,而是客户端“听不懂”caching_sha2_password
caching_sha2_password 本身不限制连接,它只是要求客户端必须支持 RSA 密钥交换或启用 TLS 才能完成握手。当客户端不满足任一条件时,协议卡在协商阶段——表现为连接超时、无响应、或直接报错 ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded。这不是服务端拒绝,是握手流程被阻塞。
常见触发组合包括:
- Navicat ≤14.2(尤其 Windows 版)、DBeaver ≤6.3.5、旧版 MySQL Workbench
- Python 的
pymysqlmysqlclient - Java 的
mysql-connector-java?useSSL=false&allowPublicKeyRetrieval=true - Docker 启动时用了
MYSQL_ROOT_PASSWORD,但没手动改插件,root 仍为caching_sha2_password
SELECT user, host, plugin FROM mysql.user WHERE user = 'xxx' 是唯一可信诊断入口
别猜,先查。连得上命令行就执行这句,重点看三列:
-
user:用户名是否匹配你连接字符串里的用户 -
host:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%'是三个完全独立的账号,Navicat 默认走127.0.0.1,不是localhost -
plugin:值为caching_sha2_password就坐实问题
如果查不到目标用户,说明连接字符串里写的用户根本不存在,得先 CREATE USER;如果存在但 plugin 不对,下一步就是 ALTER USER。
ALTER USER 必须带 BY 'pwd',漏写=清空密码锁死自己
这是最常踩的坑。以下语句是危险操作:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;
它不会保留原密码,而是把密码字段置为空字符串。正确写法必须显式重设:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';
改完立刻跟一句 FLUSH PRIVILEGES;,否则内存缓存不更新,新设置无效。
default_authentication_plugin 只管“新生儿”,老用户一个都不动
在 /etc/my.cnf 的 [mysqld] 段加 default_authentication_plugin=mysql_native_password,只影响后续 CREATE USER 创建的账号。MySQL 8.0 初始化的 root、你之前建的所有用户,plugin 字段全保持原样。重启 MySQL 也救不了它们。
云数据库(如阿里云 RDS、腾讯云 CDB)通常禁写配置文件,这条路直接不通;Docker 场景即使加了该参数,只要用了 MYSQL_ROOT_PASSWORD 环境变量,root 仍初始化为 caching_sha2_password——必须进容器手动 ALTER USER。
真正容易被忽略的,是客户端缓存:Navicat 改完服务端后不删旧连接、不重启软件,它可能还在用旧 handshake 参数反复重试;连接串里密码含 @ 或 /,URL 解析会截断,导致实际传过去的密码不对。这些细节比插件切换本身更常让修复失败。











