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

MySQL「Server has gone away」錯誤深度解析與解決方案

     編輯:MySQL 資料庫相關知識

錯誤現象

應用程式運行一段時間後,資料庫連線突然中斷,拋出 MySQL Server has gone away 錯誤。這通常不代表 MySQL 服務掛了,而是連線在 Server 端已被關閉。

核心成因與對策

1. 封包過大超過 max_allowed_packet

徵兆:執行大型 SQL(如批量 INSERT、含 BLOB/TEXT 大欄位)時觸發。
解決:修改 my.cnf(或 my.ini),增大限制:

[mysqld]
max_allowed_packet = 64M  # 視實際需求調整,建議 64M~512M

修改後重啟 MySQL 生效。亦可臨時生效(需 SUPER 權限):SET GLOBAL max_allowed_packet=67108864;

2. 連線閒置超時(wait_timeout / interactive_timeout)

徵兆:應用使用連線池或長連線(Singleton 模式),兩次操作間隔超過預設 8 小時(28800 秒),Server 主動斷開。
解決方案 A(調整 Server 端):

[mysqld]
wait_timeout = 86400
interactive_timeout = 86400

解決方案 B(應用端心跳):程式定期執行 SELECT 1 或呼叫 mysql_ping() 保持連線存活。
解決方案 C(連線池配置):設定連線池的 testWhileIdle、validationQuery 等參數,自動剔除失效連線。

3. 異常斷電或 Server 重啟

檢查 MySQL 錯誤日誌(.err),確認是否有 OOM Killer、磁碟滿、手動重啟等紀錄。

排查檢查清單

  1. 查看錯誤日誌確認具體時間點。
  2. 執行 SHOW GLOBAL VARIABLES LIKE 'wait_timeout'; 及 max_allowed_packet。
  3. 監控應用連線池狀態與 SQL 執行大小。
  4. 啟用 General Log 或 Slow Query Log 追蹤問題 SQL。

針對性調整參數與應用邏輯,即可徹底根治此錯誤。

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