MySQL 8.0修改default_authentication_plugin仅影响新建用户,必须写在[mysqld]段、完整重启且云数据库不支持;已有用户需逐个ALTER USER切换插件,并确认mysql_native_password插件已加载。

MySQL 8.0 不是“不支持”旧插件,而是默认禁用 mysql_native_password;default_authentication_plugin 配置本身在云数据库上基本无效,且只影响新用户。
为什么改了 default_authentication_plugin 还是连不上
这个配置项常被误认为“一配就灵”,实际它有三个硬性前提:
- 必须写在
[mysqld]段下,写进[client]或[mysql]段完全没用 - 修改后必须完整重启
mysqld(systemctl restart mysqld),reload不触发重载该参数 - 阿里云 RDS、腾讯云 CDB、AWS RDS 等托管服务直接屏蔽该参数,控制台或 API 均不可改
更关键的是:即使配置生效,也只对「后续新建的用户」起作用。所有已存在的用户(包括 root、应用账号)仍维持原 plugin 字段值,查 SELECT User, Host, plugin FROM mysql.user; 就能确认。
ALTER USER ... IDENTIFIED WITH mysql_native_password 报错 Plugin ‘mysql_native_password’ is not loaded
这不是配置没生效,而是插件本身被卸载或禁用了。常见于:
- MySQL 8.4+ 版本,默认关闭
mysql_native_password插件(官方逐步弃用) - 某些定制版 MySQL(如部分 Docker 镜像或安全加固镜像)启动时加了
--mysql-native-password=OFF - 手动执行过
UNINSTALL PLUGIN mysql_native_password;
验证方式:登录后执行 SHOW PLUGINS WHERE Name = 'mysql_native_password';。若状态不是 ACTIVE,就得先启用它:
INSTALL PLUGIN mysql_native_password SONAME 'mysql_native_password.so';
再补上 default_authentication_plugin = mysql_native_password(8.4+ 改用 authentication_policy = mysql_native_password),并重启。
客户端连不上,光改服务端还不够
很多情况是服务端插件改对了,但客户端驱动版本太老,握手阶段直接失败。典型表现:
- PyMySQL 报
Authentication plugin 'caching_sha2_password' is not supported→ 升级到2.0+版本 - JDBC 报
Public Key Retrieval is not allowed→ 连接串加&allowPublicKeyRetrieval=true&useSSL=false - 命令行连不上
localhost用户 → 尝试用mysql -u user -p -h 127.0.0.1绕过 socket 解析 - Navicat 12 或更早 → 必须升级到 Navicat 16+,旧版无补丁
注意:~/.my.cnf 中的 [client] default_authentication_plugin = mysql_native_password 只影响本地命令行工具,对 Python/Java 应用完全无效。
真正该优先做的:别碰全局配置,先修具体用户
绝大多数生产问题,最快解法就是精准修复出问题的账号,而不是动全局设置:
- 先查账号定义:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'app_user'; - 确保
Host完全匹配('app_user'@'%' ≠ 'app_user'@'localhost') - 执行:
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 立刻跟一句:
FLUSH PRIVILEGES;(部分云 RDS 必须加这句才生效)
这个操作不依赖配置文件、不重启服务、不影响其他用户,且所有 MySQL 8.0+ 版本都支持——只要插件没被彻底卸载。复杂点在于:你得确认每个应用用的是哪个账号、哪个 host,漏一个就白改。











