首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 導入大 SQL 文件超時/報錯終極解決方案

     編輯:MySQL 綜合教學

MySQL 導入大 SQL 文件超時/報錯終極解決方案

現場導入幾百 MB 甚至 GB 級 SQL 文件時,常遇到 MySQL server has gone away、Lost connection to MySQL server 或導入極其緩慢。本文提供一組「屢試不爽」的全局變量調整組合拳,針對網絡傳輸緩衝、超時閾值、封包大小三大核心痛點一次性解決。

核心調優指令(在 MySQL 客戶端執行)

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_packet4MB/16MB100MB+客戶端/服務端單次通信最大封包,防止大 INSERT 語句被截斷
net_buffer_length16KB100KB通信緩衝區初始大小,避免頻繁擴容導致性能抖動
interactive_timeout28800s (8h)28800000s交互式客戶端(如 mysql 命令行)空閒斷開閾值
wait_timeout28800s (8h)28800000s非交互式連接(如應用連接池)空閒斷開閾值

持久化配置(寫入 my.cnf)

[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.sql
  • 分片導入:使用 sed/awk 或 pt-fifo-split 將大文件切分為 50MB 片段,併發導入
  • 禁用索引/外鍵:導入前 SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;,導入後恢復
  • 使用源命令而非管道:mysql> source /path/dump.sql 比 mysql < dump.sql 更穩定(客戶端側緩衝)

常見誤區

  1. 只調 max_allowed_packet 忽略 net_buffer_length,導致大語句分片傳輸仍超時
  2. 超時值設得過大(如 31536000 秒)引發連接泄漏風險,建議 8-24 小時
  3. 未同步調整客戶端 --max-allowed-packet 參數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved