ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded,我第一次遇到这个报错是在帮同事处理一台 MySQL 8.0 开发库的时候。当时他执行 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';,结果直接弹了这么一行红字,整个人都有点懵。后来我仔细排查了一遍才发现,这根本不是密码写错了,也不是权限不够,而是 MySQL 8.0 默认不再加载 mysql_native_password 这个认证插件导致的。这篇文章就把我排查和解决这个问题的完整过程写出来,包括原理、复现步骤、三种修复方案、以及最容易踩的坑,希望能帮你少走弯路。
1. 先搞清楚 ERROR 1524 到底在说什么
1.1 错误信息的字面含义
这条报错的完整格式是:
text复制ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded
拆开看,1524 是 MySQL 自定义的错误码,HY000 是 ODBC 标准的通用错误类别,真正有用的信息在最后一句:Plugin 'mysql_native_password' is not loaded,意思是 MySQL 服务器当前没有加载名为 mysql_native_password 的认证插件。
这个插件是做什么的?它是 MySQL 5.x 时代默认的密码认证插件,负责把客户端提交的密码用 SHA1 算法做两次哈希,然后和 mysql.user 表里存的 authentication_string 做比对。MySQL 8.0 开始默认换成了 caching_sha2_password,mysql_native_password 虽然还在,但很多发行版的默认配置里不再加载它。于是一旦你的操作显式或隐式地引用了这个插件,服务器就报 1524。
1.2 哪些操作会触发这个报错
根据我自己的复现,下面几种操作都会踩到这个坑:
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';,手动指定用这个插件改密码。 - 某些旧版客户端或图形化工具(比如老版本的 Navicat、DBeaver)连接时,在握手阶段主动请求
mysql_native_password,而服务器没加载它,于是连接失败或后续修改用户时报 1524。 - 从 MySQL 5.7 迁移数据或配置到 8.0 时,SQL 脚本里带有
IDENTIFIED WITH mysql_native_password。 - 使用
--skip-grant-tables跳过权限表启动后,执行FLUSH PRIVILEGES或修改用户,也可能触发相关提示(后面专门说)。
值得注意的是,报错不一定发生在登录环节。有时你能正常登录,但一改密码就报错,原因就是当前会话或当前用户依赖的认证插件在服务器上不可用。
1.3 为什么 8.0 默认不加载它
MySQL 8.0 发布时,官方把默认认证插件从 mysql_native_password 换成了 caching_sha2_password。后者的安全性更高,使用 SHA256 加密,还支持服务端缓存,性能也不差。官方虽然没有立刻删除 mysql_native_password,但在 8.0 的某些版本和某些发行版中,默认不启用它。
我在一台 CentOS 上用官方 Yum 源装的 MySQL 8.0.33,执行 SHOW PLUGINS;,列表里根本没有 mysql_native_password 这一行。但我在另一台用源码编译的 8.0.36 上,同一命令却能看到它。这就有意思了:同样是 8.0,行为可能不一样。原因在于编译选项和配置文件,有的发行版把插件编译成了动态库 .so 文件,但默认没有 LOAD,需要手动加载。
提示:判断服务器是否支持某个插件,最直接的方法是查看
SHOW PLUGINS;输出,或者查information_schema.plugins表。不要凭 MySQL 版本号猜测。
1.4 其他高频相关错误速查
排查过程中我发现,和 mysql_native_password 相关的问题往往成串出现,列几个常见的供你对照:
| 错误码 | 典型信息 | 常见原因 |
|---|---|---|
| 1524 | Plugin 'mysql_native_password' is not loaded | 插件未加载,或用户指定了该插件但服务器不支持 |
| 2059 | Authentication plugin 'mysql_native_password' cannot be loaded | 客户端加载不到插件,通常发生在旧版客户端 |
| 20 |
