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),導致連線中斷。
[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
+--------------------+-----------+
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 子句 |
mydumper/myloader 多執行緒並行導出入,速度提升 5-10 倍。