mysql 8.0默认使用caching_sha2_password是因mysql_native_password依赖已被nist弃用的sha1算法,存在密码哈希碰撞风险;其要求客户端支持rsa公钥交换或tls加密握手,否则认证失败。

新装 MySQL 8.0 默认用 caching_sha2_password,不是为了“卡你”,而是它要求客户端必须支持 RSA 公钥交换或启用 TLS 才能完成认证握手——旧版 Navicat、PyMySQL、DBeaver、JDBC 驱动等压根没实现这部分协议,直接在认证阶段断连,报错如 ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded。
怎么确认真是 caching_sha2_password 在拦路
别靠错误猜,进 MySQL 命令行(mysql -u root -p)执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看三列:
-
user和host必须完全匹配你连接时写的值:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%'是三个独立账号 -
plugin列值为caching_sha2_password就坐实问题 - Navicat 默认走
127.0.0.1(TCP),不是localhost(socket),很多人只查/改了后者,结果白忙
ALTER USER 改插件必须带密码,漏写 BY 就锁死账户
这是最高频致命错误。以下语句会清空密码,导致下次连都连不上:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;
正确写法必须显式重设密码:
- 改本地 socket 连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改本机 TCP 连接(Navicat 默认):
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;,否则内存缓存不更新,新设置无效
改了服务端,客户端还连不上?这些细节比插件切换更常失败
服务端切回 mysql_native_password 后,仍连不上,大概率是客户端侧卡住了:
- Navicat 会缓存旧连接配置和握手参数,必须关掉软件重开,或删掉旧连接重建
- 密码里含
@、/、:等特殊字符,在 JDBC URL 或 Navicat 密码框中可能被 URL 解析吃掉,建议临时换纯字母数字密码测试 - 云数据库(如阿里云 RDS)禁写
/etc/my.cnf,ALTER USER是唯一入口;Docker 场景下加启动参数--default-authentication-plugin=mysql_native_password也不修复已有用户
真正容易被忽略的,从来不是“该不该切插件”,而是 host 没对上、BY 漏写了、FLUSH PRIVILEGES 忘执行、Navicat 没重启——这些操作粒度细、顺序敏感,错一个就全盘失效。











