mysql 8.4报错“plugin 'mysql_native_password' is not loaded”的根本原因是该插件默认未加载,需在my.cnf/my.ini的[mysqld]段添加mysql_native_password=on并重启服务,再验证select plugin_name from information_schema.plugins,最后执行alter user和flush privileges。

MySQL 8.4 客户端连接旧应用失败,根本原因不是配置写错了,而是服务端压根没加载 mysql_native_password 插件——它被默认禁用,且不靠重启就能生效,只靠启动时跳过注册。
ERROR 1524: Plugin 'mysql_native_password' is not loaded 怎么修
这个错误说明客户端(比如 Navicat 12、PyMySQL、老版 Node.js mysql 库)尝试用 mysql_native_password 协议握手,但 MySQL 8.4 启动时根本没注册该插件,连“加载失败”都算不上,是“从没存在过”。
-
[mysqld]配置段必须显式加mysql_native_password=ON,否则服务启动后查SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'mysql_native_password';返回空结果 - 仅加配置不生效:改完需重启
mysqld(Windows 执行net stop mysql && net start mysql;Linux 执行sudo systemctl restart mysqld) - 别信“改完配置就 OK”——重启后务必验证插件状态,不是看配置文件有没有那行,是看运行时是否真注册了
ALTER USER IDENTIFIED WITH mysql_native_password 不起作用?
执行 ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd' 报错 ERROR 1524,说明插件还没加载;报错 ERROR 1805 或 ERROR 1449,大概率是系统表损坏(如 mysql.user 列数错乱、存储引擎仍是 MyISAM),不是 SQL 写得不对。
- 必须先确保
mysql_native_password插件已加载(上一步验证通过),再执行ALTER USER -
FLUSH PRIVILEGES必须执行,否则权限缓存不更新,新认证方式不会生效 - 如果从 MySQL 5.7 直升 8.4,或升级中断过,
mysql.user表结构很可能残缺——此时ALTER USER根本进不了执行阶段,得用--initialize-insecure重建系统库,或先升到 8.0.45 再升 8.4
Java/Python/Node.js 客户端仍连不上?检查 auth_plugin 和连接参数
即使服务端插件开了、用户也切过去了,旧客户端仍可能卡在握手第一帧,因为它们默认不主动声明协议,或默认启用 SSL 强制校验。
- Java JDBC 连接串必须带
allowPublicKeyRetrieval=true,否则报Public Key Retrieval is not allowed;useSSL=false和serverTimezone=UTC也建议加上 - Python PyMySQL 初始化时必须显式传参
auth_plugin='mysql_native_password',否则它会优先尝试caching_sha2_password并失败 - Node.js 若用原生
mysql库(非mysql2),它根本不支持caching_sha2_password,也不自动 fallback,只能换库或硬切认证方式;mysql2则需确认版本 ≥ 3.0.0
Navicat / HeidiSQL / 其他 GUI 工具报 2059 错误
这类工具通常内置旧协议栈,不支持 caching_sha2_password 的密钥交换流程,报错信息常为 Authentication plugin 'caching_sha2_password' is not loaded,实际意思是“我只认 mysql_native_password,但你没给我机会用”。
- Windows 上
my.ini路径通常是C:\ProgramData\MySQL\MySQL Server 8.4\my.ini(隐藏目录,需开启显示隐藏文件) - Navicat 12 及更早版本无法自动协商协议,必须服务端强制提供
mysql_native_password支持,且用户认证方式已切换 - HeidiSQL 连接设置里有 “Authentication method” 下拉菜单,选
mysql_native_password仅是客户端提示,不解决服务端未加载的问题
最易被忽略的点:系统表损坏和插件加载顺序。很多排查停在“配置写了、SQL 执行了”,却没验证插件是否真在运行时注册,也没检查 mysql.user 表是否完整——这两者任一出问题,后续所有操作都是无用功。











