MySQL 8.4 默认不加载 mysql_native_password 插件,必须在 my.cnf 或 my.ini 的 [mysqld] 段添加 mysql_native_password=ON 并完整重启服务,再验证插件状态为 ACTIVE 后,方可执行 ALTER USER 切换认证方式。

MySQL 8.4 并没有“移除”mysql_native_password插件,而是默认不加载它——你仍能手动启用,但必须在服务启动前配置,运行中无法补救。
为什么 ALTER USER 报错 Plugin 'mysql_native_password' is not loaded
执行 ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password 时抛出该错误,说明服务端压根没注册这个插件。不是密码错了,也不是 SQL 写错了,是插件根本不存在于当前运行实例中。
常见误操作包括:
- 只改了
my.cnf里的default_authentication_plugin=mysql_native_password—— 这在 8.4 中已无效,甚至会导致启动失败 - 漏写
=ON,只写了mysql_native_password(必须是mysql_native_password=ON) - 配置写在了
[client]或[mysql]段,而不是[mysqld]段 - Windows 下改了
my.ini,但实际加载的是另一个路径的配置文件(如C:\ProgramData\MySQL\MySQL Server 8.4\my.ini)
如何正确启用 mysql_native_password 插件
唯一可靠的方式是在 my.cnf(Linux/macOS)或 my.ini(Windows)的 [mysqld] 段添加一行:
mysql_native_password=ON
然后完整重启服务:
- Linux:
systemctl restart mysqld - Windows:
net stop mysql84 && net start mysql84(注意服务名可能含版本号)
重启后立即验证:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'mysql_native_password';
必须看到 PLUGIN_STATUS 为 ACTIVE,才能继续执行 ALTER USER。如果仍是 DISABLED 或无结果,说明配置未生效。
启用后改用户认证方式的注意事项
插件激活 ≠ 用户自动切换。你仍需对每个需要兼容老客户端的账号单独执行 ALTER USER:
- 该语句会重置密码,不是“仅换插件”——生产环境务必同步通知应用方
-
FLUSH PRIVILEGES不是必须的(8.0+ 权限变更实时生效),但部分旧脚本习惯性加它,无害 - 避免直接改
root的远程访问权限(如'root'@'%'),优先锁定本地:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 若用户当前
authentication_string为空(比如刚初始化未设密),ALTER USER ... BY会报错,需先用SET PASSWORD设个临时密码再改
客户端连不上?别只盯服务器配置
插件启了、用户也切了,但 Navicat、PyMySQL、Node.js 的 mysql 库仍握手失败,问题大概率出在客户端参数没对齐:
- Java JDBC 必须加
allowPublicKeyRetrieval=true,否则报Public Key Retrieval is not allowed - Python PyMySQL 需显式传参:
auth_plugin='mysql_native_password' - Node.js 若还在用原生
mysql库(非mysql2),会直接失败——该库已停止维护,不支持 8.0+ 协议 - AI Word、DBeaver 等工具连接串里
serverTimezone和useSSL缺一不可,漏掉任一都可能静默超时
真正麻烦的不是哪一行配置写错了,而是得同步修服务端插件状态、用户认证方式、客户端驱动和连接参数——四个环节缺一不可,漏掉一个就卡死在登录前。



















