數據導入腳本運行中拋出 MySQL server has gone away,但數據庫服務進程仍在運行,其他查詢正常。
max_allowed_packet默認 max_allowed_packet=4MB,若單條 SQL 超過此限制,服務端會斷開連接,客戶端收到此錯誤。
while ($rs = mysql_fetch_array($query)) {
$os = autoaddlink($os); // 內部執行 SELECT 查詢並構建極長字符串
INSERT ...; // 將構建的超長字符串寫入
}
autoaddlink() 內部循環查詢並不斷拼接字符串,導致最終 INSERT 語句極長。
$tmpstr 在函數內部循環中持續拼接,每次調用 autoaddlink 都在上次結果基礎上疊加,而非重置。放入 while 循環後,字符串指數級增長,最終超過 max_allowed_packet。
$tmpstr = ''; 確保每次調用重置。max_allowed_packet:my.cnf 中設置 max_allowed_packet=64M(或更大),重啟生效。wait_timeout/interactive_timeout)導致連接被服務端主動斷開。.err 確認具體錯誤碼。SHOW VARIABLES LIKE 'max_allowed_packet'; 確認當前值。tcpdump)確認斷開時雙方交互。