mysql报“plugin 'auth_socket' is not loaded”错误主因是root@localhost用户认证插件设为auth_socket但未以sudo方式登录;需用sudo mysql进入后执行alter user 'root'@'localhost' identified with caching_sha2_password by '密码'切换为密码认证。

MySQL 启动后报 Plugin 'auth_socket' is not loaded
这个错误通常不是 MySQL 启动时报的,而是你在用 mysql -u root -p 登录时,客户端尝试用 auth_socket 插件鉴权,但服务端根本没加载它——常见于 Ubuntu/Debian 系统默认安装的 MySQL(尤其是 5.7+ 和 8.0),它把 auth_socket 设为 root 用户的默认认证插件,但该插件只在 mysqld 启动时按需加载,且依赖系统用户匹配逻辑。
真正的问题是:你用的是本地 root 用户登录,MySQL 却期望你以操作系统 root 身份运行 mysql 客户端(即 sudo mysql),否则插件无法验证系统用户身份,直接报错或拒绝连接。
- 如果你没用
sudo就执行mysql -u root -p,大概率会卡住、报Access denied,或出现类似Plugin 'auth_socket' is not loaded的提示(尤其在某些客户端或连接池中) - 该插件本身不支持密码验证,只认 Linux 用户名是否匹配 MySQL 用户名,所以设了密码也没用
- MySQL 8.0 默认已禁用
auth_socket插件,除非手动启用;5.7 在 Ubuntu 包里默认启用,但仅限root@localhost
检查当前 root 用户用的是哪个认证插件
先用 sudo mysql 进去(绕过认证),再查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
你会看到类似:
+------+-----------+------------+ | user | host | plugin | +------+-----------+------------+ | root | localhost | auth_socket | +------+-----------+------------+
如果 plugin 列是 auth_socket,说明问题定位准确。注意:别只看 host = 'localhost',还要确认是否真能连上——有些环境 127.0.0.1 走 TCP,触发的是 caching_sha2_password 或其他插件,行为不一致。
-
localhost走 Unix socket,触发auth_socket(若启用) -
127.0.0.1走 TCP,走的是plugin字段指定的其他插件(如caching_sha2_password) - 修改前建议先确认你常用的是哪种连接方式(命令行?应用配置?Docker?)
把 root 用户切换成 password 认证(推荐方案)
执行以下语句(仍需先用 sudo mysql 进入):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的强密码';
MySQL 8.0 推荐用 caching_sha2_password;如果是 5.7,替换为 mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';
- 必须显式指定
@'localhost',不能只写'root',否则可能改错 host - 改完立刻生效,不用重启 MySQL,但已有连接不受影响
- 如果应用连接报
Client does not support authentication protocol,说明客户端太老(如旧版 PHP mysqlnd、Navicat 旧版),需降级插件为mysql_native_password - 记得在应用配置里同步更新密码,尤其是
127.0.0.1连接方式(它不走auth_socket)
不想改插件?那就用对的方式调用 auth_socket
如果你坚持保留 auth_socket(比如追求免密 + 系统级安全),那就必须遵守它的规则:
- 只能用
sudo mysql或sudo -u mysql mysql连接,且当前 Linux 用户得是root或mysql - 不能用
-p参数,它会强制走密码流程,和插件冲突 - 不能远程连接(
host != 'localhost'),auth_socket只支持本地 socket - Docker 中若用
mysql:latest镜像,默认已禁用该插件;官方镜像从不设auth_socket给 root,这点和 Ubuntu 包完全不同
简单说:保留 auth_socket 意味着放弃通用密码登录,也放弃大多数 GUI 工具和应用直连能力——除非你明确需要这种限制。
最容易被忽略的一点:改完 plugin 后,别忘了 flush privileges;虽然 ALTER USER 一般自动刷新,但在某些 MySQL 版本或复制环境下,仍建议手动执行 FLUSH PRIVILEGES; 确保权限表同步。











