报错本质是客户端驱动不支持caching_sha2_password握手协议,最直接解法是执行alter user切换认证插件为mysql_native_password并flush privileges;改my.cnf或--default-auth仅影响新用户或当前终端,对已有用户无效。

报错本质是客户端驱动不支持 caching_sha2_password 握手协议,不是密码错了、也不是网络不通。最直接有效的解法是执行 ALTER USER 切换用户认证插件,而不是改配置文件或硬扛 SSL —— 先让连接通起来再说。
怎么确认真是 caching_sha2_password 在报错
别靠猜。登录 MySQL 命令行(用还能连上的账号,比如 root),执行:
SHOW VARIABLES LIKE 'default_authentication_plugin';<br>SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
如果 plugin 列显示 caching_sha2_password,且你用的是以下任一情况,基本就是它:
- Navicat 12 或更早版本
- JDBC 驱动是
mysql-connector-java:5.1.x - Python 用
pymysql 或 <code>mysqlclient - PHP 7.3 及更早 + 未启用
mysqli扩展
典型错误信息包括:Authentication plugin 'caching_sha2_password' cannot be loaded、Unable to load authentication plugin、或连接时直接中断无提示。
ALTER USER 切换插件的实操要点
这是唯一能立即生效、覆盖所有旧客户端的方案。注意这些容易漏掉的细节:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
- 必须写全
'user'@'host','root'@'localhost'和'root'@'%'是两个独立用户,得分别处理 - 语法必须是
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';——IDENTIFIED BY单独出现会报错 - 即使密码没变,也必须重写一遍;省略
BY子句只换插件不改密,写成ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password; - 执行完一定要跟
FLUSH PRIVILEGES;,否则不生效 - 宝塔面板用户别在 phpMyAdmin 界面点“编辑”,那个表单对
plugin字段常设为只读,必须进 SQL 标签页手动执行
为什么改 my.cnf 不顶用
default_authentication_plugin=mysql_native_password 这个配置只影响新创建的用户,对已存在的复制账号、root、应用账号完全无效。很多教程让你改完就重启 MySQL,结果发现 Navicat 还是连不上——因为旧用户根本没被改。
另外,--default-auth=mysql_native_password 这种命令行参数只作用于当前 mysql 客户端进程,对 Navicat、Java 应用、Python 脚本里的驱动毫无影响。它不改服务端元数据,纯属本地协商开关。
长期用 mysql_native_password 的风险提醒
这个插件用 SHA-1 哈希,不支持 RSA 公钥交换,密码在非 SSL 连接下可能被截获。如果你的 MySQL 暴露在公网、或要对接金融/政企系统,不能长期依赖这个降级方案。
真正需要安全合规的场景,得升级客户端驱动(比如 JDBC 换 8.0+、PyMySQL ≥ 1.0.2)、主从都跑 MySQL 8.0+、且网络直连无 NAT 或代理——但这条路在多数现有架构里反而最难落地。










