mysql.sock 是 MySQL 客戶端與 Server 在同一主機上進行進程間通信 (IPC) 的 Unix Domain Socket 文件。它繞過 TCP/IP 協議棧,提供更低延遲、更高吞吐的本地連線方式。本文系統解析其生成機制、配置管理、連線優先級與常見故障處理。
s),在 MySQL Server 啟動時由 Server 進程創建mysqld 啟動 → 創建 → 監聽 → 客戶端連接 → mysqld 關閉 → 自動刪除mysql:mysql、660)| 層級 | 配置位置 | 生效範圍 | 優先級 |
|---|---|---|---|
| 1. Server 端 | [mysqld] socket=/path/to/mysql.sock 在 my.cnf | Server 創建 Socket 路徑 | 最高 (Server 綁定) |
| 2. Client 端全域 | [client] socket=/path/to/mysql.sock 在 my.cnf | 所有客戶端工具預設連線 | 中 |
| 3. 會話級顯式指定 | mysql -S /path/to/mysql.sock 或 --socket=... | 當前連線 | 最高 (客戶端覆蓋) |
[mysqld]
socket = /var/lib/mysql/mysql.sock # 或 /tmp/mysql.sock, /run/mysqld/mysqld.sock
# 基於 datadir 相對路徑較常見:/var/lib/mysql/mysql.sock
[client]
socket = /var/lib/mysql/mysql.sock # 統一客戶端預設
[mysql]
socket = /var/lib/mysql/mysql.sock # mysql 命令列專用
| 維度 | Unix Socket | TCP/IP (127.0.0.1) |
|---|---|---|
| 協議開銷 | 無網路棧,單次系統調用 | 完整 TCP/IP 棧 (三次握手、校驗和、路由) |
| 延遲 | 極低 (~微秒級) | 較高 (~毫秒級) |
| 吞吐 | 高 (無封裝解封裝) | 標準 |
| 安全性 | 文件權限控制,僅本地用戶 | 需防火牆/綁定 127.0.0.1 防外部訪問 |
| 端口依賴 | 無 | 佔用 3306 端口 |
| 跨主機 | 不支援 | 支援 |
| 適用場景 | 本地應用、管理操作、備份腳本 | 遠程應用、異構語言驅動、容器網路 |
MySQL 客戶端智能選擇邏輯:
-h (非 localhost) → TCP/IP-S/--socket → Socket-h localhost 或無 -h 參數 → **優先 Socket** (讀取 [client] socket 配置)-h 127.0.0.1 → **強制 TCP/IP** (繞過 Socket)# 1. 確認 MySQL 進程是否運行
ps -ef | grep mysqld
systemctl status mysqld
# 2. 確認實際 Socket 路徑
# 方法 A:查看配置文件
grep socket /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 2>/dev/null
# 方法 B:查看進程啟動參數
ps -ef | grep mysqld | grep -o 'socket=[^ ]*'
# 方法 C:查找文件系統
find / -name 'mysql.sock' -type s 2>/dev/null
ls -la /var/lib/mysql/mysql.sock /tmp/mysql.sock /run/mysqld/mysqld.sock
# 3. 修正連線參數
mysql -S /var/lib/mysql/mysql.sock -u root -p # 指定正確路徑
# 或修改 my.cnf [client] socket 後重新連線
# 現象:MySQL 進程仍在運行,但 mysql.sock 不見了
# 原因:手動刪除、logrotate 執行、tmpwatch 清理 /tmp
# 解決:重啟 MySQL 服務 (唯一標準恢復方式)
systemctl restart mysqld
# 重啟過程中 Server 會重新創建 Socket 文件
# 預防:配置 Socket 路徑避開 /tmp (如 /var/lib/mysql/ 或 /run/mysqld/)
# 修改 my.cnf [mysqld] socket=/var/lib/mysql/mysql.sock
# 每個實例必須指定唯一 Socket 路徑
# 實例 1 (3306)
[mysqld]
socket = /var/lib/mysql3306/mysql.sock
port = 3306
# 實例 2 (3307)
[mysqld]
socket = /var/lib/mysql3307/mysql.sock
port = 3307
# 客戶端連線時必須同時指定 -P 和 -S
mysql -P 3307 -S /var/lib/mysql3307/mysql.sock -u root -p
# 現象:ERROR 2002 (HY000): Can't connect ... Permission denied
# 原因:Socket 文件屬主/權限不匹配
ls -la /var/lib/mysql/mysql.sock
# srwxrwxrwx 1 mysql mysql 0 Jan 1 10:00 /var/lib/mysql/mysql.sock
# 修正:確保客戶端執行用戶在 mysql 組中,或調整目錄權限
usermod -a -G mysql appuser
# 或臨時調整 (不推薦生產)
chmod 666 /var/lib/mysql/mysql.sock
-v /var/lib/mysql:/var/lib/mysql--network host 時可直接用宿主機 Socket;Bridge 模式需映射端口走 TCP/var/lib/mysql/mysql.sock (RPM/Debian 預設) 或 /run/mysqld/mysqld.sock (systemd 臨時目錄)tmpwatch/systemd-tmpfiles 會定期清理 /tmp 導致 Socket 丟失[mysqld]、[client]、[mysql] 三處 socket 參數完全一致掌握 mysql.sock 的生成邏輯、配置優先級與連線選擇機制,能快速解決 90% 的本地連線故障,並通過 Socket 連線釋放本地 TCP 端口資源、降低延遲。將標準化路徑、權限模型、監控檢查納入基礎設施規範,是穩定運維的基石。