MySQL 8.0 默认使用caching_sha2_password插件,旧客户端不兼容导致连接失败;需执行SELECT user,host,plugin FROM mysql.user WHERE user='your_user'确认插件类型,若为caching_sha2_password且客户端不支持,则用ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p'切换并FLUSH PRIVILEGES生效。

MySQL 8.0 不是“不再支持”旧认证方式,而是默认停用 mysql_native_password 插件,并强制新用户使用更安全的 caching_sha2_password;你看到的“不支持”,其实是客户端不认识这个新协议,或服务端压根没加载旧插件——问题出在协议不匹配,不是功能被删了。
怎么确认当前用户用的是哪个认证插件
登录 MySQL 后直接查 mysql.user 表:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列:
- 如果是
caching_sha2_password,而你用的是 Navicat 12、PHP 7.3 及更早、PyMySQL < 0.9.3、Node.js 的mysql包(非mysql2),基本就是它导致连接失败 - 同一用户名在
'localhost'和'%'下可能配了不同插件,必须分开查,不能只查一个 - 如果返回空或报错,说明你没权限读
mysql.user,得换高权限账号再试
ALTER USER IDENTIFIED BY 为什么改不了认证方式
ALTER USER 'u'@'h' IDENTIFIED BY 'p' 只改密码哈希值,不碰 plugin 字段。MySQL 8.0+ 默认沿用已有插件,不会自动降级。
必须显式指定插件名:
ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p';
注意几个硬性细节:
- 单引号不能省:
'u'@'h'是完整用户名+主机,漏掉任一单引号会语法错误 - 远程连接要写
'u'@'%',但得确保bind-address允许外部访问,且防火墙放行 3306 - 执行完补一句
FLUSH PRIVILEGES;,虽然多数情况自动生效,但在某些容器或云环境里不刷就无效
Plugin ‘mysql_native_password’ is not loaded 是怎么回事
这个报错不是客户端问题,是服务端根本没加载该插件——常见于 MySQL 8.4+ 或手动禁用过插件的实例。
先验证插件状态:
SHOW PLUGINS LIKE 'mysql_native_password';
如果 Status 不是 ACTIVE,就得改配置重启:
- Linux 下在
my.cnf的[mysqld]段加:plugin_load_add = mysql_native_password.so
- Windows 下对应加:
plugin_load_add = mysql_native_password.dll
- MySQL 8.4+ 已弃用
default_authentication_plugin,别再用它;该配authentication_policy=mysql_native_password - 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁止修改配置文件,这条路直接走不通,只能靠升级客户端
真正容易被忽略的一点:MySQL 8.4 开始,mysql_native_password 插件默认不加载、不启用,9.0 将彻底移除。现在靠 ALTER USER 降级,只是争取时间;该升级客户端驱动的,终究绕不开。


















