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

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

     編輯:MySQL 資料庫相關知識

錯誤現象與核心成因

當 MySQL 突然拋出 MySQL server has gone away 錯誤時,通常意味著客戶端與伺服器的連線已中斷。這在長時間執行的批次作業、大量資料匯入或連線池管理不當時最為常見。主要成因集中在兩大類:封包過大超過 max_allowed_packet 限制,以及連線閒置超過 wait_timeout 導致被伺服器主動斷開。

方案一:調整封包大小限制

若錯誤源於 SQL 語句過長或包含 BLOB/TEXT 大欄位,需在 my.cnf(Windows 為 my.ini)的 [mysqld] 區段加大 max_allowed_packet:

[mysqld]
max_allowed_packet = 64M  # 視實際需求調整,建議 16M~1G 之間

修改後必須重啟 MySQL 服務生效。臨時方案可在連線時執行 SET GLOBAL max_allowed_packet=67108864;(需 SUPER 權限)。

方案二:延長連線存活時間

針對長連線(如 Singleton 模式資料庫連線池)閒置超時問題,可調整兩個參數:

  • wait_timeout:非互動式連線閒置秒數,預設 28800 秒(8 小時)
  • interactive_timeout:互動式連線閒置秒數

建議配置:

[mysqld]
wait_timeout = 31536000   # 1 年
interactive_timeout = 31536000

或在程式碼中定期呼叫 mysql_ping()(PHP) / connection.ping()(Python)維持心跳,或啟用連線池的 testOnBorrow / validationQuery 機制。

方案三:應用層面的最佳實踐

  1. 拆分大交易:批次匯入時分批次提交,避免單一交易過久。
  2. 使用預處理語句:減少封包大小並防 SQL 注入。
  3. 連線池配置:設定 maxLifetime 短於 wait_timeout,啟用 idleTimeout 回收閒置連線。
  4. 重試機制:捕獲 Communications link failure / 2006 / 2013 錯誤碼時自動重連並重試。

驗證與監控

修改後執行 SHOW GLOBAL VARIABLES LIKE '%timeout%'; 及 SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; 確認生效。長期建議監控 Aborted_connects、Connection_errors_internal 等狀態變數,及早發現連線異常。

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