ERROR 2006 (HY000): MySQL server has gone away -- 或 -- Error Code: 2006 - MySQL server has gone away
典型場景:匯入 10MB+ 的大型 SQL 檔案(含大量 INSERT 或巨大 BLOB),過程中斷連線。
max_allowed_packet 限制(預設 4MB/16MB/64MB 視版本)wait_timeout/interactive_timeout(預設 28800 秒)[mysqld] # 最大允許封包:建議 256MB-1GB,視最大 SQL 行大小而定 max_allowed_packet = 512M # 連線等待超時:延長至 24 小時以上,防止長時間匯入中斷 wait_timeout = 86400 interactive_timeout = 86400 # 針對大量寫入的額外優化 innodb_buffer_pool_size = 4G # 視記憶體調整,建議 50-70% 實體記憶體 innodb_log_file_size = 512M # 加大 Redo Log,減少 checkpoint 壓力 innodb_flush_log_at_trx_commit = 2 # 匯入期間暫設 2,完成後改回 1 sync_binlog = 0 # 匯入期間暫關閉 Binlog 同步,完成後改回 1
systemctl restart mysqld # 或 service mysql restart
SHOW VARIABLES LIKE 'max_allowed_packet'; SHOW VARIABLES LIKE 'wait_timeout';
mysqldump、mysql 客戶端也有自己的 max_allowed_packet,必須同步調大:
# 導入時指定 mysql --max_allowed_packet=512M -u root -p db_name < large_backup.sql # 或在客戶端配置檔 [mysql] max_allowed_packet = 512M
split -l 10000 將大 SQL 拆為多個小檔,逐個匯入SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; SOURCE large_backup.sql; SET foreign_key_checks=1; SET unique_checks=1; COMMIT;
mydumper/myloader:多線程並行,速度快 5-10 倍pt-fifo-split:管道分割導入/var/log/mysql/error.log 確認具體原因dmesg | grep -i kill 排除 OOM Killerdf -h 與 inode df -imysqlbinlog 重放 Binlog 替代 SQL 匯入--max_allowed_packet=512M 參數max_allowed_packet 變更告警