MySQL 8.0升级后老客户端连接报错ERROR 1251,因默认认证插件改为caching_sha2_password;需对每个现有用户执行ALTER USER ... IDENTIFIED WITH mysql_native_password修改认证方式,而非仅配置default_authentication_plugin。

MySQL 8.0 升级后连接报错 ERROR 1251: Client does not support authentication protocol
这是最典型的症状:老客户端(比如 MySQL 5.7 客户端、某些 PHP 扩展、旧版 Navicat 或 DBeaver)连不上新 MySQL 8.0+ 实例,日志里明确提示不支持认证协议。根本原因是 MySQL 8.0 默认改用 caching_sha2_password 插件,而旧客户端只认 mysql_native_password。
- 别急着改全局 default_authentication_plugin —— 它只影响新建用户的默认插件,对已有用户无效
- 真正要动的是具体用户的认证方式,不是服务端开关
- 如果用 root 连不进,得先用 --skip-grant-tables 启动临时绕过验证,再改用户插件
给指定用户切换回 mysql_native_password 认证
必须登录 MySQL(哪怕用临时免密方式),对每个需要兼容的用户执行 ALTER USER。这不是配置文件开关,是数据字典层面的修改。
- 确认当前用户用的什么插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 切换认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 强制重载权限:
FLUSH PRIVILEGES; - 注意
@'%'要和创建用户时的 host 完全一致,'localhost'和'127.0.0.1'是两个不同用户
my.cnf 里设 default_authentication_plugin 没用?
设了 default_authentication_plugin = mysql_native_password 确实能让新 CREATE USER 不带 IDENTIFIED WITH 时默认用它,但不影响已存在用户,也不解决老客户端连不上 root 的问题。很多人配了却没效果,就是卡在这儿。
- 该配置只在用户创建时起作用,已有用户 plugin 字段不变
- MySQL 8.0.4+ 允许在 CREATE USER 时显式指定:
CREATE USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p'; - 如果应用部署脚本会自动建库建用户,记得检查是否硬编码了认证方式
PHP mysqli/pdo 连接失败的典型表现与修复
PHP 7.2+ 默认支持 caching_sha2_password,但低版本(尤其 PHP 7.0/7.1)或某些编译选项缺失的二进制包会直接拒绝握手。错误常表现为“Authentication plugin 'caching_sha2_password' cannot be loaded”或空连接失败。
- 查 PHP MySQLi 支持的认证插件:
var_dump(mysqli_get_client_info());,看是否含 sha256 - PDO 连接时可强制指定插件(需驱动支持):
mysql:host=localhost;dbname=test;charset=utf8mb4;auth_plugin=mysql_native_password - 更稳妥的做法仍是把数据库侧用户插件切回
mysql_native_password,而非依赖客户端升级
真正麻烦的不是改一个配置,而是你得逐个核对所有业务账号、监控账号、备份账号、CI 脚本用的账号——漏掉任意一个,都可能在某次发布后突然失联。老系统里那些写死在 shell 脚本里的 mysql -u... -p... 命令,最容易被忽略。



















