mysql客户端连localhost默认走unix域套接字(linux/macos)或命名管道(windows),不走tcp/ip;强制走tcp需用127.0.0.1或具体ip。

MySQL客户端和服务端通信方式取决于是否同机、操作系统类型和显式配置,不是“自动选最优”,而是按规则逐条匹配。你连不上,大概率是没对上这三条路径中的任意一条。
mysql命令里写localhost到底走TCP还是socket
写 localhost 默认走 Unix 域套接字(Linux/macOS)或命名管道(Windows),**不走 TCP/IP**。这是 MySQL 客户端的硬编码逻辑,和 DNS 解析无关。
- 想强制走 TCP,必须用
127.0.0.1或具体 IP,不能写localhost -
mysql -h localhost -u root -p→ 查找/tmp/mysql.sock或/var/run/mysqld/mysqld.sock -
mysql -h 127.0.0.1 -u root -p→ 连 3306 端口(或-P指定的端口) - 如果 socket 文件路径不对,会报错:
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
连接时提示“Access denied for user”但密码没错
这常是因为认证插件或 host 匹配失败,跟通信协议本身无关,但容易被误判为网络问题。
- 用户记录里
host字段是localhost,你却用127.0.0.1连——这是两个不同账号,权限可能不一致 - MySQL 8.0+ 默认用
caching_sha2_password插件,老客户端(如某些 JDBC 驱动)不支持,需显式指定--default-auth=mysql_native_password或改用户插件 -
SELECT user, host, plugin FROM mysql.user;查真实 host 和插件,别只看用户名
Unix socket 文件找不到或权限拒绝
socket 文件本质是文件系统上的一个特殊文件(类型 s),路径错、权限不足、服务未监听都会导致失败。
- 服务端启动时没加
--socket=/path/to/mysql.sock,就用默认路径;客户端不指定--socket就查默认路径 - 常见默认路径:
/tmp/mysql.sock(macOS)、/var/run/mysqld/mysqld.sock(Debian/Ubuntu)、/var/lib/mysql/mysql.sock(CentOS/RHEL) - 检查文件是否存在且可读:
ls -l /var/run/mysqld/mysqld.sock;若无,说明 mysqld 没启,或启了但没监听 socket(比如配置了skip-networking) - 权限问题:socket 文件属主必须是
mysql用户,且目录(如/var/run/mysqld)需对运行客户端的用户可访问
真正麻烦的点不在协议选择本身,而在于错误信息不暴露底层路径或协议跳转逻辑——比如连 localhost 失败时,它不会告诉你“我正在找 socket”,只会抛一个模糊的连接错误。动手前先确认 mysqld 实际监听了什么,比反复试参数更省时间。











