應用程式運行一段時間後,資料庫連線突然中斷,拋出 MySQL Server has gone away 錯誤。這通常不代表 MySQL 服務掛了,而是連線在 Server 端已被關閉。
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;
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 等參數,自動剔除失效連線。
檢查 MySQL 錯誤日誌(.err),確認是否有 OOM Killer、磁碟滿、手動重啟等紀錄。
SHOW GLOBAL VARIABLES LIKE 'wait_timeout'; 及 max_allowed_packet。針對性調整參數與應用邏輯,即可徹底根治此錯誤。