MySQL 8.4 默认不加载 mysql_native_password 插件,需先通过 INSTALL PLUGIN 或配置 plugin_load_add 启用,再执行 ALTER USER;否则报错“Plugin 'mysql_native_password' is not loaded”。

MySQL 8.4 默认不加载 mysql_native_password 插件,不是配置遗漏,而是官方主动移除支持 —— 直接改用户认证方式会失败,必须先启用插件。
为什么 ALTER USER 报错 Plugin 'mysql_native_password' is not loaded
在 MySQL 8.4 LTS(2024 年起的默认行为)中,mysql_native_password 插件不再随服务自动加载,即使你在 my.cnf 或 my.ini 里没显式禁用它。所以执行 ALTER USER ... IDENTIFIED WITH mysql_native_password 时,服务器找不到该插件,直接抛出错误 ERROR 1524 (HY000)。
这不是密码或权限问题,是插件根本未注册进内核。你不能跳过这步去“改用户”,必须先让它可用。
- 检查是否加载:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'mysql_native_password';—— 大概率返回空结果 - 临时启用(重启失效):
INSTALL PLUGIN mysql_native_password SONAME 'auth_socket.so';在部分 Windows 版本上需用auth_plugin_mysql_native_password.dll,Linux/macOS 通常为auth_plugin_mysql_native_password.so - 永久启用:在配置文件
[mysqld]段下添加plugin_load_add = auth_plugin_mysql_native_password.so(路径需绝对、且文件真实存在)
如何安全地为特定用户切换回 mysql_native_password
插件启用后,再改用户才有效。但注意:MySQL 8.4 对 mysql_native_password 已标记为 deprecated,且只允许对非 root 用户或明确指定 host 的账户操作;盲目改 'root'@'%' 可能破坏远程管理能力。
- 优先锁定本地访问:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 如需远程兼容,单独处理:
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'pass123'; GRANT ALL ON *.* TO 'appuser'@'%';,而不是硬改 root - 必须刷新:
FLUSH PRIVILEGES;—— 否则新插件设置不生效 - 验证:
SELECT user, host, plugin FROM mysql.user WHERE user IN ('root', 'appuser');确认 plugin 列值为mysql_native_password
Navicat / Python / Node.js 连不上?先确认客户端实际用的协议
很多工具(比如 Navicat 15 以下、mysql npm 包旧版、PyMySQL 1.0 之前)默认协商 mysql_native_password,但 MySQL 8.4 新建用户默认用 caching_sha2_password。错误提示 Client does not support authentication protocol 是客户端发握手包时被服务器拒绝,不是连接超时。
- Navicat:升级到 v16+ 或在连接属性 → 高级 → 勾选 “使用旧版身份验证(MySQL 5.x)”
- Python(PyMySQL):
connect(..., auth_plugin='mysql_native_password')显式指定 - Node.js(mysql2):
{ authPlugin: 'mysql_native_password' } - Java JDBC:URL 加参数
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false,新版驱动(8.4.0+)才默认支持caching_sha2_password
真正麻烦的不是改插件,而是 MySQL 8.4 要求你同时处理插件加载、用户作用域(@'localhost' 和 @'%' 是两个独立账户)、以及客户端是否真能协商成功 —— 少一个环节,就卡在连接前的最后一米。


















