ERROR 2006 (HY000): MySQL server has gone away 表示 Client 與 Server 連線已中斷。
SHOW GLOBAL STATUS LIKE 'Uptime' 或錯誤日志確認。wait_timeout (預設 28800 秒) 到期,Server 主動斷開。長連線 (如 PHP Singleton 模式) 最易中招。SHOW GLOBAL STATUS LIKE 'Com_kill' 非零即有人為或腳本殺掉進程。max_allowed_packet (預設 1MB)。[mysqld]
wait_timeout = 2880000
interactive_timeout = 2880000
或在程式連線後執行:SET SESSION interactive_timeout=86400。
[mysqld]
max_allowed_packet = 16M # 視需求調整,如 10M、32M
動態生效:SET GLOBAL max_allowed_packet = 16777216; (需重新連線)。
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 釋放失效資源才能真正重連成功。
大量 DELETE/INSERT 分批 LIMIT 1000 + usleep() 執行,防止阻塞導致連線逾時。
my.cnf (Windows 為 my.ini) [mysqld] 區段,重啟服務。SET GLOBAL max_allowed_packet = 20M;,重新連線後生效,重啟失效。Aborted_clients、Aborted_connects 計數器是否持續增長。--skip-networking 等網路問題也會產生此錯誤。