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

MySQL server has gone away 錯誤原因分析與完整解決方案

     編輯:MySQL 資料庫相關知識

錯誤含義

ERROR 2006 (HY000): MySQL server has gone away 表示 Client 與 Server 連線已中斷。

四大常見原因

  1. MySQL 服務異常重啟:查看 SHOW GLOBAL STATUS LIKE 'Uptime' 或錯誤日志確認。
  2. 連線閒置超時:wait_timeout (預設 28800 秒) 到期,Server 主動斷開。長連線 (如 PHP Singleton 模式) 最易中招。
  3. 連線被主動 KILL:SHOW GLOBAL STATUS LIKE 'Com_kill' 非零即有人為或腳本殺掉進程。
  4. 封包過大:SQL 語句或 BLOB/TEXT 資料超過 max_allowed_packet (預設 1MB)。

核心解決方案

1. 調整逾時參數 (針對長連線/批次腳本)

[mysqld]
wait_timeout = 2880000
interactive_timeout = 2880000

或在程式連線後執行:SET SESSION interactive_timeout=86400。

2. 加大封包限制 (針對大欄位/大 SQL)

[mysqld]
max_allowed_packet = 16M  # 視需求調整,如 10M、32M

動態生效:SET GLOBAL max_allowed_packet = 16777216; (需重新連線)。

3. 應用層心跳重連機制 (推薦做法)

function ping() {
    if (!mysql_ping($this->link)) {
        mysql_close($this->link);  // 關鍵:必須先關閉舊連線
        $this->connect();          // 重新建立
    }
}

// 使用時機:長時間非 DB 操作 (如爬蟲抓取網頁) 之後
$db->ping();
$db->query('SELECT * FROM table');

mysql_ping 若偵測斷線會嘗試重連,但需先 mysql_close 釋放失效資源才能真正重連成功。

4. 避免長時間鎖表 / 大筆交易

大量 DELETE/INSERT 分批 LIMIT 1000 + usleep() 執行,防止阻塞導致連線逾時。

修改參數兩種方式

  1. 永久生效:編輯 my.cnf (Windows 為 my.ini) [mysqld] 區段,重啟服務。
  2. 臨時生效:SET GLOBAL max_allowed_packet = 20M;,重新連線後生效,重啟失效。

排查清單

  • 檢查 Aborted_clients、Aborted_connects 計數器是否持續增長。
  • 確認 Client/Server 版本相容 (舊 Client 連新 Server 可能有 16MB 封包限制)。
  • DNS 解析失敗、防火牆阻斷、--skip-networking 等網路問題也會產生此錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved