mysql连接被拒绝需先区分socket或tcp路径:linux/macos默认用socket,指定-h 127.0.0.1则走tcp;查错误是否含socket字样,再核对mysqld实际监听路径、文件权限及目录持久性。

MySQL 连接被拒绝:先确认是 socket 还是 TCP 拒绝
连接被拒绝(ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' 或类似)不等于服务没起——它只说明客户端没找到可用的通信路径。Linux/macOS 下本地连接默认走 Unix socket,Windows 走 TCP;但即使在 Linux,如果你显式指定 -h 127.0.0.1,也会强制走 TCP,此时若 mysqld 没监听 127.0.0.1:3306 或防火墙拦截,就报“Connection refused”而非 socket 错误。
快速区分方式:
- 不加
-h或用-h localhost→ 走 socket(Linux/macOS 默认行为) - 用
-h 127.0.0.1或-h ::1→ 强制走 TCP - 查错误信息里是否含
socket字样或路径 —— 有则优先查 socket 文件
找不到 /tmp/mysql.sock?查 mysqld 实际监听的 socket 路径
MySQL 启动时会按配置顺序决定 socket 路径:mysqld 配置里的 socket 项 > 编译默认路径 > 客户端配置里的 socket。常见错位就是服务端和客户端读了不同配置文件,用了不同路径。
操作步骤:
- 运行
mysqladmin -u root -p variables | grep socket(如果还能连上) - 连不上?直接看进程:运行
ps aux | grep mysqld,找带--socket=的参数,例如--socket=/var/run/mysqld/mysqld.sock - 或者查配置文件:
mysqld --help --verbose 2>/dev/null | grep "socket",输出里 “Default options” 下的路径是编译默认值,但实际以配置文件为准 - 常见路径还有:
/var/lib/mysql/mysql.sock、/usr/local/mysql/tmp/mysql.sock、/opt/homebrew/var/mysql/mysql.sock(macOS Homebrew)
socket 文件存在但权限不对:group 和 sticky bit 是关键
Unix socket 是一个特殊文件,不仅要看 ls -l /path/to/mysql.sock 的属主/属组,还要看 mysqld 进程的运行用户(通常是 mysql)能否被客户端用户(如你的 ubuntu 或 zsh 当前用户)访问到。典型问题:
- socket 文件属组不是当前用户所在组(比如属组是
mysql,但你不在该组) - socket 所在目录(如
/var/run/mysqld/)权限为drwxr-x---,其他用户无法进入目录,自然打不开 socket - socket 文件本身权限不含 group 可读写(应为
srw-rw----),或缺少 sticky bit(虽不影响连接,但影响并发安全)
修复建议:
- 把当前用户加入
mysql组:sudo usermod -aG mysql $USER,然后重新登录终端 - 改 socket 目录权限(仅测试环境):
sudo chmod 755 /var/run/mysqld(生产环境慎用) - 更稳妥的方式:在
my.cnf的[client]段显式指定 socket 路径,与服务端一致:[client] socket = /var/run/mysqld/mysqld.sock
连接仍失败?检查 socket 文件是否被删、是否被 systemd-tmpfiles 清理
某些系统(尤其是使用 systemd 的发行版)会在重启后清空 /tmp 或 /var/run 下内容。如果 mysqld 配置的 socket 路径落在这些临时目录下,且启动顺序没配好(比如 mysqld 在 tmpfiles 清理之后才启动),就会出现“文件曾存在,现在没了”的情况。
验证方法:
- 重启 mysqld:
sudo systemctl restart mysql,立刻ls -l /var/run/mysqld/看 socket 是否生成 - 查 journal:
sudo journalctl -u mysql --since "1 hour ago" | grep -i sock,留意是否有 “Failed to create socket file” 或 “Permission denied” - 若 socket 目录在
/tmp,考虑迁移到持久路径,如/var/lib/mysql/mysql.sock,并在my.cnf中同步修改socket配置
socket 文件生命周期依赖于 mysqld 进程存活和目录持久性,这点比 TCP 端口更“脆弱”,排查时容易忽略目录本身的可写性与保留策略。











