萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL localhost 無法連線?Socket 配置錯誤完整排查指南

現象:localhost 連不上,127.0.0.1 卻正常

許多開發者遇過這種詭異情況:PHP 用 localhost 連 MySQL 失敗,改成 127.0.0.1 卻秒連。命令列 mysql -h localhost 也報錯,但 mysql -h 127.0.0.1 正常。權限、防火牆、服務狀態皆無問題。

根因:兩種連線協議的本質差異

連線方式主機標識傳輸協議MySQL 權限匹配
TCP/IP127.0.0.1 / 實際 IP網路埠 (預設 3306)user@'127.0.0.1' 或 user@'%'
Unix Socketlocalhost本地檔案 Socket (/var/run/mysqld/mysqld.sock)user@'localhost'

關鍵點:MySQL 內部將 localhost 硬編碼為 Socket 連線,127.0.0.1 則走 TCP。兩者權限獨立,Socket 路徑若不一致即連線失敗。

三步修復流程

步驟 1:確認 MySQL 實際 Socket 路徑

mysqld --verbose --help | grep -i socket
# 輸出範例:socket    /var/run/mysqld/mysqld.sock

步驟 2:修正 PHP 設定 (php.ini)

; 找到並修改
mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock

修改後:

  • CLI/CGI 模式即時生效。
  • PHP-FPM 需重啟:systemctl restart php-fpm 或 service php7.4-fpm restart。

步驟 3:驗證修復

php -r "new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); echo 'OK';"

Windows 環境特殊處理

Windows 無 Socket 機制,localhost 經解析走 TCP。若報 ERROR 2003 (HY000): Can't connect ... (10061),請檢查:

  1. MySQL 服務是否啟動:net start mysql 或服務管理器啟動。
  2. 埠 3306 是否被佔用/防火牆攔截。
  3. 配置檔 my.ini 是否有 skip-networking 或 bind-address=127.0.0.1 限制。

進階:統一使用 127.0.0.1 避開 Socket 坑

若不想折騰 Socket,應用層統一改用 127.0.0.1 最省心:

  • 連線字串:mysql:host=127.0.0.1;dbname=test
  • 權限只需授權 user@'127.0.0.1' 或 user@'%'
  • 跨容器/雲環境遷移更無縫

理解協議差異,連線問題迎刃而解。

copyright © 萬盛學電腦網 all rights reserved