首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

6GB 大資料庫導入實戰:命令行 mysql < dump.sql 成功關鍵與常見錯誤排查 (OOM/Duplicate/Timeout/版本)

     編輯:MySQL 資料庫相關知識

超大 SQL 檔案導入最佳實踐:只用命令行,拒絕 GUI 工具

6 GB (壓縮後 1.3 GB) 大庫導入,GUI 工具 (SQLyog、phpMyAdmin、PHP 腳本) 皆因記憶體/上傳限制/超時失敗。唯一可靠方式:命令行 mysql < dump.sql 直連導入,配合參數調優與錯誤處理。

核心導入命令

# 基礎命令
mysql -uroot -p -h localhost --default-character-set=utf8mb4 \
  --max-allowed-packet=1G \
  --net-buffer-length=1M \
  database_name < dump.sql

# 生產建議:忽略錯誤繼續 (慎用,會跳過衝突行)
mysql -uroot -p -f database_name < dump.sql

# 進度監控 (需安裝 pv)
pv dump.sql | mysql -uroot -p database_name

四大常見錯誤與解決

錯誤原因解決
ERROR 5 (HY000): Out of memory (Needed X bytes)客戶端/伺服器記憶體不足,大 INSERT 緩衝區 OOM1. 加 -f 忽略錯誤繼續 (可能丟資料)
2. 調大 max_allowed_packet (客戶端/伺服器雙端)
3. 拆分 SQL 檔 (見下文)
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'主鍵/唯一鍵衝突,目標表已有資料或 Dump 含重複1. 導入前 TRUNCATE TABLE 清空
2. 分區表主鍵限制:主鍵必須包含分區鍵,或移除主鍵改唯一索引
3. 用 REPLACE INTO / INSERT IGNORE 重新導出
ERROR 2006 (HY000): MySQL server has gone away封包過大/超時導致連線斷開調大 my.cnf:
max_allowed_packet=1G
wait_timeout=28800 (8h)
interactive_timeout=28800
重啟生效
版本不兼容:高版本 Dump 導入低版本5.7 Dump 含 5.7 專屬語法 (如 JSON、GIS、GTID) 導入 5.6/5.5 失敗1. 同版本環境導入
2. 導出加 --compatible=mysql56 (有限支援)
3. 手動修正 SQL 檔 (移除不兼容語句)

大檔案拆分策略 (必要時)

# 按行拆分 (每 10 萬行一檔)
split -l 100000 dump.sql dump_part_

# 或按大小拆分 (每 500MB)
split -b 500M dump.sql dump_part_

# 依序導入
for f in dump_part_*; do
  echo "Importing $f..."
  mysql -uroot -p database_name < "$f"
done
  • 拆分後每檔需包含完整 CREATE TABLE / INSERT 結構,否則導入失敗。
  • 工具 sed/awk 可提取單表導入,便於並行/重試。

導入前必做檢查清單

  1. 目標庫字元集 = Dump 字元集 (SHOW CREATE DATABASE / head -50 dump.sql)。
  2. 目標表結構存在且為空 (或預期合併)。
  3. 關閉 Binlog (導入端) 節省空間加速:SET SESSION sql_log_bin=0; (需 SUPER 權限)。
  4. 調大 innodb_buffer_pool_size (如 70% 記憶體)、innodb_log_file_size (1G+)、innodb_flush_log_at_trx_commit=2 (導入期間犧牲 1 秒安全換速度)。
  5. 禁用外鍵/唯一檢查:SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; 導入後恢復。

導入後驗證

# 行數核對
SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db_name';

# 關鍵表抽樣
SELECT COUNT(*) FROM core_table;
SELECT * FROM core_table ORDER BY id DESC LIMIT 10;

# 檢查錯誤日誌
grep -i error /var/log/mysql/error.log
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved