現象:導入 10MB+ SQL 腳本時,報錯 Error 2006 - MySQL server has gone away。小文件正常。根因:**單條 SQL/數據包超過 max_allowed_packet 默認限制(4MB/16MB),導致連接被服務端斷開**。
# 編輯 my.cnf [mysqld] 區 [mysqld] max_allowed_packet = 300M # 最大允許封包(建議 100M-1G,視最大 SQL 大小) wait_timeout = 200000 # 非交互超時秒數(防長事務斷開) interactive_timeout = 200000 # 交互超時秒數 # 重啟生效 service mysql restart # 或動態生效(僅當前連接,重啟失效) SET GLOBAL max_allowed_packet = 300*1024*1024; SET GLOBAL wait_timeout = 200000;
| 參數 | 默認值 | 建議值 | 作用 |
|---|---|---|---|
| max_allowed_packet | 4MB (≤5.6) / 16MB (5.7+) | 100M-1G | 單次通信最大封包,影響 INSERT 批次、LOAD DATA、Binlog 事件 |
| wait_timeout | 28800 (8h) | 86400+ (1天+) | 非交互連接空閒斷開時間,長導入需調大 |
| interactive_timeout | 28800 | 同 wait_timeout | 交互式客戶端空閒斷開 |
| net_read_timeout | 30 | 600+ | 讀取封包超時,大包傳輸慢需調大 |
| net_write_timeout | 60 | 600+ | 寫入封包超時 |
場景 典型原因 排查重點 導入大 SQL 封包超限 max_allowed_packet 長時間無操作 空閒超時 wait_timeout / interactive_timeout 大事務提交 鎖等待/鎖超時 innodb_lock_wait_timeout 主從同步中斷 網絡抖動/從庫慢 slave_net_timeout / heartbeat 連接池驗證失敗 後端已斷開 驗證查詢 / 驗證間隔 「MySQL server has gone away」90% 是封包或超時,雙端調大、寫配置、重啟驗證,三步解決。