萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 大檔案匯入報錯 "MySQL server has gone away" 完整解決方案

常見錯誤現象

ERROR 2006 (HY000) at line ***: MySQL server has gone away
ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes

根因:SQL 檔過大,單條語句或封包超過 max_allowed_packet 限制 (預設 4MB/64MB),導致連線中斷。

核心解決:調大 max_allowed_packet

1. 修改配置檔 (永久生效)

[mysqld]
max_allowed_packet = 512M   # 視最大 SQL 檔大小設定,建議 512M~1G

重啟驗證:

systemctl restart mysqld
mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 536870912 |  -- 512M = 536870912 bytes
+--------------------+-----------+

2. 動態調整 (臨時,重啟失效)

mysql> SET GLOBAL max_allowed_packet = 536870912;

匯入指令最佳實踐

# 指定字元集,避免亂碼
mysql -u root -p --default-character-set=utf8mb4 db_name < huge_dump.sql

# 或在 mysql shell
mysql> SET NAMES utf8mb4;
mysql> SET GLOBAL max_allowed_packet = 536870912;
mysql> SOURCE /path/huge_dump.sql;

其他常見問題與對策

錯誤/現象原因解決
Unknown command '''SQL 檔含特殊字元、編碼錯誤確認檔案為 UTF-8 無 BOM;檢視該行上下文
匯入極慢預設 autocommit=1,每行提交檔頭加 SET autocommit=0; 檔尾加 COMMIT; 或用 --single-transaction 導出
外鍵約束失敗導出順序導致父表未建立導出加 --disable-keys (MyISAM) 或導入前 SET FOREIGN_KEY_CHECKS=0;
權限不足備份含 VIEW/TRIGGER/DEFINER導入前建立同名用戶,或用 sed 移除 DEFINER 子句

超大資料庫 (>10GB) 建議方案

  1. 物理備份:Percona XtraBackup (熱備份、不鎖表、增量備份)。
  2. 並行匯入:mydumper/myloader 多執行緒並行導出入,速度提升 5-10 倍。
  3. 分表匯入:按表拆分 SQL 檔,並行導入不同表。
copyright © 萬盛學電腦網 all rights reserved