前言
本文針對兩大高頻錯誤 MySQL server has gone away 與 Can't connect to [local] MySQL server,提供成因分析、排查步驟、解決方案與配置調整建議。
一、錯誤 1:MySQL server has gone away
相關錯誤:Lost connection to server during query
主要成因
- 連線逾時: 預設 8 小時無活動自動斷開(
wait_timeout)。
- 查詢過大/異常: 封包超過
max_allowed_packet(預設 1MB),伺服器視為客戶端錯誤而斷開。
- 伺服器崩潰/重啟: 實際服務已停止。
排查與解決
- 檢查服務存活:
mysqladmin version 看 Uptime。
- 腳本端實作**自動重連**機制(發查詢前先 ping 或捕獲錯誤重連)。
- 調大封包限制:啟動參數
-O max_allowed_packet=16M(按需分配記憶體)。
- 調整逾時:
wait_timeout=28800(秒)或更大。
常見錯誤代碼
| 代碼 | 含義 |
| CR_SERVER_GONE_ERROR | 客戶端無法發送查詢給伺服器 |
| CR_SERVER_LOST | 發送成功但未收到完整回應 |
二、錯誤 2:Can't connect to [local] MySQL server
兩種連線方式
- Unix Socket: 本機連線,透過檔案
/tmp/mysql.sock,速度較快。
- TCP/IP: 透過 Port 3306,支援跨主機。
若未指定主機或用 localhost → 自動走 Socket;指定 IP/主機名 → 走 TCP/IP。
排查清單
- 服務是否啟動?
ps aux | grep mysqld 確認進程存在。
- Socket 檔案是否存在?
ls -l /tmp/mysql.sock。可能被 cron 清理誤刪。
- Port 是否正確? 預設 3306,檢查
my.cnf 或啟動參數。
- 防火牆/SELinux 阻擋? 開放 3306 或 Socket 路徑權限。
- MIT-pthreads 環境: 無原生執行緒系統需指定
-h hostname 強制 TCP/IP。
測試連線指令集
mysqladmin version
mysqladmin variables
mysqladmin -h `hostname` version
mysqladmin -h `hostname` --port=3306 version
mysqladmin -h 'your_ip' version
mysqladmin --socket=/tmp/mysql.sock version
注意: `hostname` 為反引號(鍵盤左上角),非單引號。
Socket 路徑自訂
# 編譯時指定
./configure --with-unix-socket-path=/path/to/socket
# 啟動時指定
safe_mysqld --socket=/path/to/socket &
# 客戶端環境變數
export MYSQL_UNIX_PORT=/path/to/socket
三、Linux 核心傾倒導致執行緒殭屍
若發現 mysqld 進程殘留,需用 mysql_zap 腳本清理後再重啟。
小結
「逾時斷線」與「Socket/Port 不匹配」佔 90% 以上連線錯誤。建立連線池健檢、調整 wait_timeout/max_allowed_packet、固定 Socket 路徑、監控服務存活,可徹底消除此類問題。
- 上一篇文章: Linux 應用整合 MySQL 資料庫存取技巧:架構優勢、Tcl/C++ 範例與交易處理介紹
- 下一篇文章: MySQL 安全性指南:內部檔案系統防護與外部網路授權雙重防線建立
Copyright ©
程式碼之家 All Rights Reserved