auth_socket插件需手动启用且依赖系统用户匹配:先检查插件状态,若未加载则install plugin;创建同名系统用户和mysql用户(@'localhost'),并用identified with auth_socket定义;确保socket路径一致且可访问。

auth_socket 插件必须启用,且用户必须在操作系统中存在,否则 mysql -u myuser 会直接报错 Access denied for user 'myuser'@'localhost'。
确认 MySQL 是否已加载 auth_socket 插件
不是所有 MySQL 安装默认启用该插件。运行以下命令检查:
mysql -u root -p -e "SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'auth_socket';"
如果返回空或 DISABLED,需手动安装:
-
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';(MySQL 8.0+) - MariaDB 通常自带且默认启用,但路径可能为
auth_socket或unix_socket,可用SHOW PLUGINS;全局查看 - 插件文件名因发行版而异:
auth_socket.so(MySQL)、unix_socket.so(某些 MariaDB)
创建匹配的操作系统用户和数据库用户
二者用户名必须完全一致,且 @'localhost' 是硬性要求——不能用 @'127.0.0.1' 或通配符。
- 先建系统用户:
sudo adduser myuser(不要加--disabled-password,否则 socket 认证会失败) - 再进 MySQL 创建用户:
CREATE USER 'myuser'@'localhost' IDENTIFIED WITH auth_socket; - 授权后必须执行:
FLUSH PRIVILEGES;,否则权限不生效 - 验证方式只能是切换到该用户后直连:
su - myuser -c "mysql -u myuser",不能带-p或-S参数
为什么 mysql -u myuser -S /var/run/mysqld/mysqld.sock 仍提示密码?
客户端显式指定 socket 路径时,MySQL 仍会按常规流程查 mysql.user 表,但认证插件是否触发取决于用户定义中的 IDENTIFIED WITH 字段,而非连接方式。
- 错误常见于:用户创建时用了
IDENTIFIED BY(即设了密码),覆盖了 socket 认证逻辑 - 修复方法:
DROP USER 'myuser'@'localhost';后重新用IDENTIFIED WITH auth_socket创建 - 检查用户认证方式:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'myuser';,结果必须是auth_socket - 注意:MySQL 8.0 默认密码插件是
caching_sha2_password,它与auth_socket互斥,不能共存于同一账户
权限目录和 socket 路径不匹配导致连接被拒绝
即使插件启用、用户正确,若 MySQL 实际监听的 socket 文件不在预期位置,auth_socket 根本不会被调用——连接阶段就失败了。
- 查真实 socket 路径:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';" - 确认该路径存在且属主为
mysql用户:ls -l $(mysql -Nse "SHOW VARIABLES LIKE 'socket'" | awk '{print $2}') - 如果路径是
/tmp/mysql.sock但实际服务监听在/var/run/mysqld/mysqld.sock,客户端会 fallback 到 TCP,然后走密码认证流程 - 临时解决:启动时加
-S /var/run/mysqld/mysqld.sock;长期方案:统一配置[client]段的socket值
真正起作用的是三者严丝合缝:系统用户存在 + 数据库用户用 auth_socket 创建 + MySQL 正在监听的 socket 路径可访问。漏掉任意一环,都会退化成密码登录或连接失败。











