首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決「Can't connect to local MySQL server through socket」連線失敗全攻略

     編輯:MySQL 資料庫相關知識

錯誤 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 表示客戶端找不到 Unix Domain Socket 檔案。原因通常是:**服務未啟動、Socket 路徑不一致、權限問題、配置檔讀取順序錯誤**。本文提供 5 級排查方案,由簡入繁。

現象確認

mysql -u root -p
# ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

方案 1:確認服務狀態並重啟 (最常見)

# 檢查進程
ps -ef | grep mysqld
# 無輸出 = 服務未跑

# 系統服務管理
systemctl status mysqld        # CentOS 7+/RHEL 7+
service mysql status           # CentOS 6/Ubuntu 14.04-
systemctl start mysqld         # 或 service mysql start

# 若掛載點滿、權限錯誤導致啟動失敗,查看錯誤日誌
tail -50 /var/log/mysqld.log   # 或 /var/log/mysql/error.log

方案 2:修正 Socket 路徑不一致 (核心原因)

MySQL 編譯預設 /tmp/mysql.sock,但許多套件 (RPM/DEB/源碼安裝) 放在 /var/lib/mysql/mysql.sock 或 /var/run/mysqld/mysqld.sock。客戶端讀取 [client] 區段的 socket 參數。

# 1. 找出實際 socket 位置
find / -name "mysql.sock" -o -name "mysqld.sock" 2>/dev/null
# 輸出範例:/var/run/mysqld/mysqld.sock

# 2. 修改 /etc/my.cnf (或 /etc/mysql/my.cnf)
[mysqld]
socket = /var/run/mysqld/mysqld.sock

[client]
socket = /var/run/mysqld/mysqld.sock

# 3. 重啟服務
systemctl restart mysqld

快速臨時修法:建立軟連結指向客戶端預期路徑:

ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
# 立即生效,無需重啟

方案 3:權限問題

# Socket 目錄與檔案必須屬於 mysql 用戶
chown -R mysql:mysql /var/run/mysqld
chown -R mysql:mysql /var/lib/mysql
# 目錄權限 755,socket 檔案 660
chmod 755 /var/run/mysqld
chmod 660 /var/run/mysqld/mysqld.sock

方案 4:配置檔讀取順序與多實例衝突

MySQL 讀取配置檔順序:

/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf

若多實例共用 /etc/my.cnf 但各實例 mysqld_multi 或 systemd 傳遞 --defaults-file 不同,導致 socket 參數不一致。解決:

  • 各實例使用專屬 --defaults-file=/etc/my.cnf.3306。
  • 客戶端連線顯式指定:mysql -S /var/run/mysqld/mysqld.sock -u root -p。

方案 5:SELinux / AppArmor 阻擋

# 暫時關閉 SELinux 驗證
setenforce 0
# 或永久修改 /etc/selinux/config: SELINUX=permissive

# AppArmor (Ubuntu/Debian)
aa-status | grep mysql
# 若處於 enforce,修改 /etc/apparmor.d/usr.sbin.mysqld 添加 socket 目錄權限

驗證清單

檢查項指令預期
服務進程ps -ef | grep mysqld有 mysqld 主進程
Socket 存在ls -l /var/run/mysqld/mysqld.socksrwxrwxrwx mysql:mysql
配置一致grep socket /etc/my.cnf /etc/mysql/my.cnfmysqld/client 同一路徑
本地連線mysql -S /var/run/mysqld/mysqld.sock -u root -p成功進入 mysql>
TCP 連線mysql -h 127.0.0.1 -u root -p成功 (繞過 socket)

避坑指南

  • Docker 容器內預設只有 TCP,無 socket,請用 -h 127.0.0.1。
  • /tmp 定期清理 (systemd-tmpfiles) 會刪除 socket,導致重啟前正常、重啟後失敗 → **不要把 socket 放在 /tmp**。
  • 升級 MySQL 版本後,mysql_upgrade 可能重置配置,重啟前務必核對 socket 參數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved