mysql 8.0 默认认证插件 caching_sha2_password 与旧客户端不兼容,需对已有用户执行 alter user ... identified with mysql_native_password,新建用户时直接指定该插件,注意区分 localhost 与 127.0.0.1 并重启客户端。

MySQL 8.0 连接报错 “Client does not support authentication protocol requested by server” 怎么办
这是 MySQL 8.0 默认使用 caching_sha2_password 插件导致的典型兼容性问题,老版本客户端(如 MySQL 5.7 客户端、某些 Python 驱动、旧版 Navicat、PHP mysqli 扩展等)不识别该插件,直接拒绝连接。
如何临时或永久切换为 mysql_native_password
不能只改用户密码,必须显式指定身份验证插件;否则即使重设密码,新密码仍绑定原插件。操作分两种场景:
- 对已有用户(如
root):执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 新建用户时直接指定:执行
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'pass123'; - 若需全局默认(不推荐),可修改配置文件
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]下加一行:default_authentication_plugin=mysql_native_password,然后重启 MySQL
为什么改了插件还是连不上?常见漏掉的点
容易忽略权限刷新和 host 匹配细节:
-
FLUSH PRIVILEGES;不是必须的 ——ALTER USER已自动生效,但很多人误以为要刷权限才生效 - 注意
@'localhost'和@'127.0.0.1'是两个不同用户,本地连接用 socket 时走localhost,TCP 连接走127.0.0.1,必须分别处理 - 某些客户端(如 MySQL Workbench)会缓存认证方式,改完插件后需关闭并重新打开连接窗口,不能仅点击“重连”
- 如果用 Docker 启动 MySQL,确认容器内实际运行的是你修改后的配置,而不是挂载了旧配置或用了镜像默认启动参数
改回 mysql_native_password 有什么代价
安全性和功能上确实有折损:
-
mysql_native_password使用 SHA1 加盐哈希,不支持 RSA 密钥交换,明文密码可能在非 TLS 链路上被截获(而caching_sha2_password支持安全握手) - 无法使用 MySQL 8.0 的双密码、密码历史、锁定策略等高级账户管理特性(它们依赖新插件的元数据存储格式)
- 部分云数据库(如阿里云 RDS、腾讯云 CDB)禁止手动修改认证插件,只能通过控制台开启兼容模式或升级客户端
真正长期方案不是降级插件,而是升级客户端驱动 —— 比如 Python 用 mysqlclient>=2.0.0 或 pymysql,Java 用 mysql-connector-java 8.0.23+,这些都已原生支持 caching_sha2_password。











