新安装的MySQL 8.0+用户登录失败,是因为默认使用caching_sha2_password插件,而旧版客户端(如PHP MySQLi、旧Python驱动、Navicat)不支持该认证协议,报错“Client does not support authentication protocol requested by server”;解决方法是执行ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password'并FLUSH PRIVILEGES,再查mysql.user确认plugin已更新。

为什么新安装的MySQL 8.0+用户登录会失败
MySQL 8.0 默认使用 caching_sha2_password 插件,而很多老客户端(如旧版 PHP MySQLi、某些 Python 驱动、Navicat 旧版本)不支持该插件,连接时直接报错:Client does not support authentication protocol requested by server。这不是密码错了,是认证协议不兼容。
修改单个用户的验证方式为 mysql_native_password
最安全的做法是只改特定用户(比如你的应用账号),不影响 root 或其他新用户。执行以下 SQL:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
注意替换 your_username 和 your_password;如果用户允许远程连接,把 'localhost' 换成 '%' 或具体 IP。
- 必须用
ALTER USER ... IDENTIFIED WITH,不能只用SET PASSWORD,后者不会改认证插件 - 执行后需运行
FLUSH PRIVILEGES;(部分版本要求,MySQL 8.0.16+ 通常自动刷新) - 如果提示
ERROR 1396 (HY000):说明该用户不存在,先用CREATE USER创建再改
永久禁用 caching_sha2_password(不推荐,仅限开发环境)
如果想让所有新建用户都默认用 mysql_native_password,需修改 MySQL 配置文件(如 /etc/mysql/my.cnf 或 /usr/my.cnf),在 [mysqld] 段落下加一行:
default_authentication_plugin=mysql_native_password
然后重启 MySQL:sudo systemctl restart mysql(Linux)或 brew services restart mysql(macOS Homebrew)。
- 重启后新建用户才会默认用该插件;已有用户不受影响,仍需手动
ALTER USER - 生产环境不建议全局关闭
caching_sha2_password,它比mysql_native_password更安全(支持 SHA-256 加密、可缓存凭据) - 某些云数据库(如阿里云 RDS、AWS RDS)禁止修改此配置,只能改单个用户
验证是否生效
登录 MySQL 后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
确认返回的 plugin 列值是 mysql_native_password,不是 caching_sha2_password。
- 如果仍连不上,检查客户端是否缓存了旧连接参数(比如 PHP 的
mysqli扩展需重启 Web 服务) - Docker 环境中,若用
mysql:8.0镜像启动容器,可通过-e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password提前设置
改完别急着删备份——caching_sha2_password 是 MySQL 8 的默认选择,有其合理性;临时切回旧协议只是权宜之计,长期应升级客户端或驱动支持。



















