MySQL 8.0 默认认证插件为 caching_sha2_password,老客户端不兼容会报错2059;应使用 ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p'; 切换并 FLUSH PRIVILEGES;若插件未加载需 INSTALL PLUGIN 或升级客户端。

MySQL 8.0 默认用 caching_sha2_password,老客户端(比如 Navicat 12、PHP 7.x 的 mysqli、旧版 Python PyMySQL、某些 Java JDBC 驱动)根本认不出这个插件,直接报错 Client does not support authentication protocol requested by server 或 ERROR 2059。这不是密码错了,也不是权限没开,是协议层就断在握手第一步。
执行 ALTER USER 切换单个用户插件最稳妥
这是生产环境和云数据库(如阿里云 RDS)唯一推荐的方式,不影响其他用户,改完立刻生效:
- 必须用完整语法:
ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';—— 缺少BY子句会清空密码,SET PASSWORD或只改authentication_string不生效 -
host必须完全匹配:查当前定义用SELECT User, Host FROM mysql.user WHERE User = 'username';,若显示'app'@'192.168.1.100',就不能写成'app'@'%' - 改完必须执行
FLUSH PRIVILEGES;,部分 MySQL 8.0 小版本(尤其是云厂商定制版)不刷新不会更新plugin字段 - 验证是否成功:
SELECT user, host, plugin FROM mysql.user WHERE user = 'username';,确认plugin列是mysql_native_password
报错 Plugin 'mysql_native_password' is not loaded 怎么办
这个 ERROR 1524 意味着 MySQL 实例压根没加载该插件——不是你改错了,是服务端根本没启用它。常见于手动设了 default_authentication_plugin=mysql_native_password 却没重启,或从老配置迁移时遗漏了插件加载项:
- 先检查插件状态:
SHOW PLUGINS;,搜索mysql_native_password行,看Status是否为ACTIVE - 如果没加载,手动启用:
INSTALL PLUGIN mysql_native_password SONAME 'auth_socket.so';—— 注意:MySQL 8.4+ 已移除此插件,该命令会失败,只能切回caching_sha2_password并升级客户端 - 更安全的做法是放弃
mysql_native_password,改用支持它的客户端驱动(如 JDBC 加?allowPublicKeyRetrieval=true&useSSL=false),尤其在新项目中
my.cnf 改 default_authentication_plugin 只影响新用户
在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段下加 default_authentication_plugin = mysql_native_password,看似一劳永逸,但实际限制很多:
- 改完必须
sudo systemctl restart mysql(reload无效),否则配置不加载 - 该设置**只对后续新建的用户生效**,已有用户(包括 root、复制账号、应用账号)的
plugin字段完全不变,仍需单独ALTER USER - 阿里云 RDS、腾讯云 CDB、AWS RDS 等托管服务禁止修改此参数,配置会被忽略
- MySQL 8.4 开始,
mysql_native_password插件已被标记为废弃,强行启用存在兼容风险
最容易被忽略的一点:即使你把所有用户的插件都切成了 mysql_native_password,如果客户端连接时指定了错误的 host(比如用户是 'user'@'localhost',但 Navicat 填的是 127.0.0.1),或者密码里有 !、$ 这类 shell 特殊字符没用单引号包裹,照样连不上——这些细节比插件本身更容易卡住人。


















