mysql 8.4起mysql_native_password插件默认禁用且状态为disabled,执行alter user指定该插件会报“not loaded”错误;需先用show plugins确认状态,但不可动态启用,因其自8.0.34起已弃用、9.0将移除。

MySQL 8.0 中 mysql_native_password 不是“突然失效”,而是被明确弃用且默认不加载;真正要解决的,不是让它复活,而是判断当前连接失败是否真的需要它——多数情况下,改用户插件或升级客户端更安全、更可持续。
为什么执行 ALTER USER ... IDENTIFIED WITH mysql_native_password 会报错 Plugin 'mysql_native_password' is not loaded
MySQL 8.4 已默认禁用该插件,8.0 虽保留但常处于 DISABLED 状态。用 SHOW PLUGINS LIKE 'mysql_native_password'; 查看,如果 Status 是 DISABLED,说明插件虽存在,但未加载,此时直接指定它会失败。
- 不能靠
INSTALL PLUGIN动态启用:MySQL 8.0+ 不允许运行时加载已弃用插件 - 配置文件里加
plugin-load-add=mysql_native_password可能触发启动失败,尤其在 8.4+ 版本 - 某些云数据库(如阿里云 RDS)直接屏蔽该插件的加载行为,配置无效
ALTER USER 切换插件时必须匹配 host 才生效
root@'localhost' 和 root@'127.0.0.1' 是两个独立用户,插件设置互不影响。本地 GUI 工具(如 Navicat、SQLyog)常走 TCP 连接,实际匹配的是后者;而终端 mysql -u root -p 默认走 socket,匹配前者。
- 查清楚你要连的是哪个:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 必须分别执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'pwd';和ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH caching_sha2_password BY 'pwd'; - 改完不用
FLUSH PRIVILEGES;——ALTER USER已即时更新权限表
客户端报错 “Authentication plugin 'caching_sha2_password' cannot be loaded” 的真实原因
这不是服务器端问题,是客户端驱动太老:PHP 的 mysqlnd MySQLdb、旧版 JDBC 驱动都不认识这个插件名。
- 临时解法:对用户执行
ALTER USER ... IDENTIFIED WITH mysql_native_password(前提是插件已加载) - 长期解法:升级驱动——Python 换
pymysql或mysqlclient>=2.0.0,Java 换mysql-connector-java 8.0.23+ - Docker 场景下注意:容器内 MySQL 启动时读的是挂载进来的
my.cnf,别改了宿主机配置却忘了重启容器
最易被忽略的一点:MySQL 8.4 开始,mysql_native_password 插件不再随服务启动自动加载,且官方文档已标注“deprecated since 8.0.34,to be removed in 9.0”。任何依赖它的方案,本质上都是在给技术债计息。











