| 方式 | 速度 | 適用場景 |
|---|---|---|
| phpMyAdmin / Navicat 導入 | 極慢(逐行解析、HTTP 開銷) | 小檔 < 50MB、圖形化偏好 |
| 命令列 mysql 直導 | 快 10~100 倍 | **生產標準做法** |
mysql -u root -p dbname < /path/to/dump.sql
# 或進入客戶端
mysql -u root -p
USE dbname;
SOURCE /path/to/dump.sql;
實測:原需數小時的導入,命令列僅需幾十秒~幾分鐘。
mysqldump -u root -p dbname \
--single-transaction \
--quick \
--extended-insert \
--max_allowed_packet=1G \
--net_buffer_length=1M \
> dump.sql
--extended-insert:多行 INSERT,大幅減少網路往返與解析。--max_allowed_packet / --net_buffer_length:匹配目標庫設定,**不可超過目標庫值**,否則導入報錯。
[mysqld]
innodb_buffer_pool_size=4G # 視記憶體 60~70%
innodb_log_file_size=1G
innodb_flush_log_at_trx_commit=2 # 導入期間犧牲耐久換速度
sync_binlog=0 # 關閉 binlog 同步
max_allowed_packet=1G
net_buffer_length=1M
導入完成後**恢復原值**並重啟。
SHOW VARIABLES LIKE 'max_allowed_packet';
SHOW VARIABLES LIKE 'net_buffer_length';
導出時參數 ≤ 目標庫參數。
# 導出
mysqldump -u root -p jb51.net goodclassification \
-e --max_allowed_packet=1048576 --net_buffer_length=16384 \
> www.jb51.net.sql
# 導入
mysql -u root -p jb51.net < www.jb51.net.sql
MySQL server has gone away → 調大 max_allowed_packet、wait_timeout。Packet too large → 導出/導入參數超過限制。innodb_flush_log_at_trx_commit=1 導致大量 fsync,暫設為 2。