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

解決 MySQL "Server has gone away" 錯誤的完整指南

     編輯:MySQL 資料庫相關知識

問題背景

在使用 MySQL 綠色版(免安裝版)的過程中,經常遇到客戶端連接後出現 MySQL Server has gone away 錯誤。這通常發生在連接閒置超過預設逾時時間,或是執行大型 SQL 語句時。

快速解決方案:調整 wait_timeout

修改 MySQL 設定檔 my.ini(Windows)或 my.cnf(Linux):

# 原設定
wait_timeout=10

# 修改為較大值(單位:秒,此處為 800 小時)
wait_timeout=2880000
interactive_timeout=2880000

儲存後無需重啟服務即可生效(視版本而定,建議重啟以確保生效)。

常見原因與對應方案

1. 連接閒置超時(最常見)

  • 現象:應用程式使用連線池或 Singleton 模式複用連接,兩次操作間隔超過 wait_timeout(預設 8 小時)。
  • 方案:
    • 增大 wait_timeout 與 interactive_timeout
    • 程式碼中定期呼叫 mysql_ping() 保持連線活躍
    • 使用連線池並啟用驗證機制(如 testOnBorrow)

2. SQL 語句或封包過大

  • 現象:執行大型 INSERT、含 BLOB/TEXT 欄位,或單次查詢超過 max_allowed_packet(預設 1MB/4MB/16MB,視版本)。
  • 方案:調大 max_allowed_packet(伺服器端與客戶端皆需設定):
    [mysqld]
    max_allowed_packet = 64M  # 依需求調整
    

3. 程式端重連邏輯缺陷

  • 現象:PHP 等語言中僅檢查 !$conn 判斷是否重連,但連接物件可能仍存在卻已被伺服器斷開。
  • 方案:改用 mysql_ping() 驗證連線有效性:
    if (!$conn) {
        $conn = mysql_connect(...);
    } elseif (!mysql_ping($conn)) {
        mysql_close($conn);
        $conn = mysql_connect(...);
    }
    mysql_query($sql, $conn);
    

4. 其他可能原因

  • MySQL 服務端主動殺掉執行緒(KILL 指令)
  • TCP/IP 連線在客戶端逾時(MYSQL_OPT_READ_TIMEOUT)
  • DNS 解析失敗導致連線中斷
  • fork() 子程序共用同一連接
  • 伺服器端 Bug 導致執行查詢時崩潰

進階建議

  • 監控 Aborted_clients、Aborted_connects 狀態變數
  • 生產環境建議啟用自動重連(MYSQL_OPT_RECONNECT)
  • 大量資料匯入時,分批執行 INSERT,避免單次封包過大
  • 確保客戶端與伺服器版本相容

參考資源

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