當 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 機制。
maxLifetime 短於 wait_timeout,啟用 idleTimeout 回收閒置連線。Communications link failure / 2006 / 2013 錯誤碼時自動重連並重試。修改後執行 SHOW GLOBAL VARIABLES LIKE '%timeout%'; 及 SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; 確認生效。長期建議監控 Aborted_connects、Connection_errors_internal 等狀態變數,及早發現連線異常。