Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

MySQL Socket 連線失敗:/var/lib/mysql/mysql.sock 與 /tmp/mysql.sock 路徑衝突完整解決方案

編輯:Linux 教學

問題背景

在部署 LAMP/LNMP 環境時,常遇到 MySQL Client、PHP 擴展與資料庫服務對 Unix Socket 路徑認知不一致的問題。典型現象為:

  • 資料庫管理工具(如 Database Client)僅能連線 /var/lib/mysql/mysql.sock
  • PHP 應用(mysqli/pdo_mysql)卻只能連線 /tmp/mysql.sock
  • 雙方互不相容,導致開發、生產環境頻繁切換配置

根本原因分析

MySQL 編譯安裝時 --with-unix-socket-path 參數決定預設 Socket 路徑;而 PHP 編譯參數 --with-mysql-sock、--with-mysqli、--with-pdo-mysql 再次指定 Socket 路徑。若兩者編譯參數不同,或 my.cnf 中 [client]、[mysqld] 區塊的 socket 設定不一致,即會產生路徑分歧。

三種標準解決方案

方案一:統一 my.cnf 配置(推薦)

編輯 /etc/my.cnf(或 /etc/mysql/my.cnf),確保 [mysqld]、[client]、[mysql] 三區塊皆指向同一路徑:

[mysqld]
socket = /var/lib/mysql/mysql.sock

[client]
socket = /var/lib/mysql/mysql.sock

[mysql]
socket = /var/lib/mysql/mysql.sock

重啟 MySQL 服務:systemctl restart mysqld

方案二:建立符號連結(快速修復)

若不想動編譯參數,可建立軟連結讓雙方路徑互通:

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

注意: 需確保 MySQL 進程對目標目錄有讀寫權限(通常屬於 mysql:mysql)。

方案三:PHP 程式碼層面指定 Socket

在連線字串中顯式指定 unix_socket 參數,覆蓋預設值:

<?php
// mysqli 物件導向風格
$mysqli = new mysqli('localhost', 'root', 'password', 'dbname', 3306, '/var/lib/mysql/mysql.sock');

// PDO 風格
$dsn = 'mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=dbname';
$pdo = new PDO($dsn, 'root', 'password');
?>

驗證連線測試腳本

<?php
$host = '127.0.0.1'; // 強制走 TCP 避開 Socket
$user = 'root';
$pass = '008';

$link = mysqli_connect($host, $user, $pass);
if (!$link) {
    die('連線失敗: ' . mysqli_connect_error());
}
echo '連線成功!';
mysqli_close($link);
?>

關鍵提醒:

  1. 使用 127.0.0.1 而非 localhost,強制走 TCP/IP 協議繞過 Socket 問題
  2. 確保 MySQL 授權表包含 root@127.0.0.1 或 root@%
  3. 防火牆需放行 3306 埠:firewall-cmd --add-port=3306/tcp --permanent

進階排查指令

# 檢查 MySQL 實際監聽的 Socket
mysqladmin variables | grep socket

# 檢查 PHP 編譯參數
php -i | grep -i socket

# 即時監控 Socket 檔案
ls -l /var/lib/mysql/mysql.sock /tmp/mysql.sock

最佳實踐總結

生產環境建議採用 方案一 從源頭統一路徑,並將 Socket 檔案放置於 /var/lib/mysql/ 等持久化目錄,避免 /tmp 因系統清理導致 Socket 遺失。若歷史專案難以統一,可結合方案二(符號連結)與方案三(程式碼顯式指定)過渡兼容。

Copyright © Windows教程網 All Rights Reserved