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 緩衝區 OOM | 1. 加 -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=1Gwait_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 可提取單表導入,便於並行/重試。SHOW CREATE DATABASE / head -50 dump.sql)。SET SESSION sql_log_bin=0; (需 SUPER 權限)。innodb_buffer_pool_size (如 70% 記憶體)、innodb_log_file_size (1G+)、innodb_flush_log_at_trx_commit=2 (導入期間犧牲 1 秒安全換速度)。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