現場導入幾百 MB 甚至 GB 級 SQL 文件時,常遇到 MySQL server has gone away、Lost connection to MySQL server 或導入極其緩慢。本文提供一組「屢試不爽」的全局變量調整組合拳,針對網絡傳輸緩衝、超時閾值、封包大小三大核心痛點一次性解決。
SET GLOBAL max_allowed_packet = 100000000; -- 100MB,最大通信封包 SET GLOBAL net_buffer_length = 100000; -- 100KB,TCP/Socket 通信緩衝區 SET GLOBAL interactive_timeout = 28800000; -- 8小時,交互式連接空閒超時 SET GLOBAL wait_timeout = 28800000; -- 8小時,非交互式連接空閒超時
| 參數 | 默認值 | 建議值 | 作用機制 |
|---|---|---|---|
max_allowed_packet | 4MB/16MB | 100MB+ | 客戶端/服務端單次通信最大封包,防止大 INSERT 語句被截斷 |
net_buffer_length | 16KB | 100KB | 通信緩衝區初始大小,避免頻繁擴容導致性能抖動 |
interactive_timeout | 28800s (8h) | 28800000s | 交互式客戶端(如 mysql 命令行)空閒斷開閾值 |
wait_timeout | 28800s (8h) | 28800000s | 非交互式連接(如應用連接池)空閒斷開閾值 |
[mysqld] max_allowed_packet = 100M net_buffer_length = 100K interactive_timeout = 28800000 wait_timeout = 28800000
修改後 systemctl restart mysqld 生效,避免重啟失效。
mysqldump --single-transaction --quick --max_allowed_packet=100M db > dump.sqlsed/awk 或 pt-fifo-split 將大文件切分為 50MB 片段,併發導入SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;,導入後恢復mysql> source /path/dump.sql 比 mysql < dump.sql 更穩定(客戶端側緩衝)max_allowed_packet 忽略 net_buffer_length,導致大語句分片傳輸仍超時--max-allowed-packet 參數