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

MySQL.sock 連線失敗徹底排查:多種修正路徑與 PHP/phpMyAdmin 設定指南

     編輯:MySQL 資料庫相關知識

錯誤現象

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
# 或
Warning: mysql_connect(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

核心原因:MySQL 實際建立的 socket 檔路徑 與 客戶端預期路徑 不一致。常見於編譯安裝、套件管理器安裝、多版本共存環境。

根因分析

  • MySQL 編譯/安裝參數 --with-unix-socket-path 決定預設 socket 路徑(如 /var/lib/mysql/mysql.sock、/tmp/mysql.sock、/var/run/mysqld/mysqld.sock)。
  • PHP mysql.default_socket、phpMyAdmin $cfg['Servers'][$i]['socket']、MySQL 客戶端庫 mysql_config --socket 若未同步修改,即會去錯誤路徑尋找 socket。

五種修正方案(按推薦順序)

方案 1:統一 my.cnf 設定(治本,推薦)

[mysqld]
socket = /var/lib/mysql/mysql.sock   # 實際路徑

[client]
socket = /var/lib/mysql/mysql.sock   # 客戶端預設路徑

[mysql]
socket = /var/lib/mysql/mysql.sock   # mysql 命令列專用

修改後 systemctl restart mysql,所有原生客戶端(mysql、mysqladmin、mysqldump)自動生效。

方案 2:建立軟連結(最快急救)

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
# 或反向
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

讓雙方路徑指向同一實體檔,無需重啟服務,但重啟後可能失效(/tmp 可能被清理),建議加入啟動腳本。

方案 3:修改 PHP 設定

; php.ini
mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock

重啟 Apache/PHP-FPM 生效。適用於無法動 my.cnf 的託管環境。

方案 4:phpMyAdmin 專屬設定

// config.inc.php
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';

僅影響 phpMyAdmin,不影響 CLI 或其他 PHP 應用。

方案 5:連線字串顯式指定(程式碼層面)

# PHP PDO
$dsn = "mysql:host=localhost;dbname=test;unix_socket=/var/lib/mysql/mysql.sock";

# PHP mysqli
$mysqli = new mysqli('localhost', 'user', 'pass', 'db', 3306, '/var/lib/mysql/mysql.sock');

# Python mysqlclient
conn = MySQLdb.connect(host='localhost', unix_socket='/var/lib/mysql/mysql.sock', ...)

# JDBC (Connector/J 8.0+)
jdbc:mysql://localhost/db?socketFactory=com.mysql.cj.protocol.unix.UnixSocketFactory&unixSocketPath=/var/lib/mysql/mysql.sock

驗證實際 Socket 路徑的標準方法

# 方法 1:mysqladmin
mysqladmin -u root -p variables | grep socket

# 方法 2:mysql 命令列
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"

# 方法 3:ps 檢查啟動參數
ps aux | grep mysqld | grep -o 'socket=[^ ]*'

最佳實踐清單

  1. 安裝/升級後立即檢查 socket 變數,確認與預期一致。
  2. 統一由 my.cnf [client] 區段管控,避免多處分散設定。
  3. 容器化環境掛載 /var/lib/mysql 或 /run/mysqld 為 Volume,socket 自動共享。
  4. 監控腳本定期檢查 ls -l /var/lib/mysql/mysql.sock 存在性與權限(mysql:mysql 755)。

結語

Socket 路徑不符是 MySQL 部署的「頭號陷阱」,但本質只是路徑約定不一致。掌握 my.cnf 統一配置、軟連結急救、PHP/phpMyAdmin 專屬覆寫 三大招式,並建立「部署後必驗證 socket」檢查清單,即可永久杜絕此類連線故障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved