根本原因是mysql 8.0默认使用caching_sha2_password认证插件,而pymysql、navicat 12、php 5.6 mysqli等旧客户端不支持该插件,导致连接时在密码验证前即报“authentication plugin 'caching_sha2_password' cannot be loaded”错误;解决需在create user或alter user时显式指定identified with mysql_native_password by 'pwd',并确保所有用户插件统一。

MySQL 8.0 默认用 caching_sha2_password,5.7 默认是 mysql_native_password——这不是配置开关,而是安装时就写死的认证方式,直接决定旧客户端能不能连上。
为什么旧客户端连不上 MySQL 8.0?
报错 Authentication plugin 'caching_sha2_password' cannot be loaded 不是密码错,是客户端压根不认识这个插件。PyMySQL、Navicat 12、PHP 5.6 的 mysqli、Node.js 的 mysql2(低于 2.3.0)等都默认不支持它。
- 不是所有驱动都支持 SHA-256 握手协议,尤其老版本根本没实现该插件逻辑
- 错误发生在 TCP 连接建立后、密码验证前,所以日志里看不到 auth failed,只看到 plugin 加载失败
- 即使你改了密码、重连、重启服务,只要插件没换,问题依旧
CREATE USER 时必须显式指定插件
MySQL 8.0 创建用户不继承全局默认插件,但如果你不写,就会用 caching_sha2_password 存密码,导致后续连接失败。
- 正确写法:
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 错误写法:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd';→ 插件自动设为caching_sha2_password -
IDENTIFIED WITH和IDENTIFIED BY必须同时出现,顺序不能反;WITH后是插件名,BY后才是密码
ALTER USER 会悄悄覆盖认证插件
这是最隐蔽的坑:哪怕你当初用 mysql_native_password 创建的用户,执行 ALTER USER 'u'@'%' IDENTIFIED BY 'new' 后,插件会被重置为 caching_sha2_password,已有应用瞬间断连。
- 安全做法始终带插件:
ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'new'; - 检查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'u'; - 别依赖
FLUSH PRIVILEGES—— 它不刷新认证插件缓存,改完直接生效
真正麻烦的不是改一次,而是所有新建用户、所有后续改密操作,都得绷着这根弦——漏掉一个,就有一个服务连不上。











