導入 100MB+ SQL 文件是常見運維場景。本文對比命令行直連、phpMyAdmin 兩大路徑,提供參數調優、分卷導入、並行導入等實戰方案,解決超時、內存溢出、編碼亂碼等痛點。
# 全庫導入
mysql -uroot -p db_name < dump.sql
# 指定庫導入(mysqldump 導出格式)
mysql -uroot -p db_name < db_name.sql
# 單表導入
mysql -uroot -p db_name < table_name.sql
實測:121MB、1萬+ 行數據,Linux 命令行 **秒級完成**。優勢:無中間層、流式處理、內存常駐低、支援斷點續傳(配合 pv 監控進度)。
| 參數 | 默認值 | 說明 | 建議值 |
|---|---|---|---|
post_max_size | 8M | POST 最大體積 | 1024M |
upload_max_filesize | 2M | 單文件上傳上限 | 1024M |
memory_limit | 128M | PHP 腳本內存上限 | 512M |
max_execution_time | 30s | 腳本最大執行時間 | 0 (無限制) |
max_input_time | 60s | 解析輸入數據最大時間 | 0 |
; 找到並修改
post_max_size = 1024M
upload_max_filesize = 1024M
memory_limit = 512M
max_execution_time = 0
max_input_time = 0
; 重載 PHP-FPM / Apache
systemctl reload php-fpm
# 或
systemctl reload httpd
; config.inc.php
$cfg['UploadDir'] = '/var/lib/phpmyadmin/upload'; # 預上傳目錄
$cfg['SaveDir'] = '/var/lib/phpmyadmin/save';
$cfg['ExecTimeLimit'] = 0; # 覆蓋 max_execution_time
$cfg['MemoryLimit'] = '512M';
大文件建議:SCP 上傳至 UploadDir,phpMyAdmin 下拉選擇導入,避免瀏覽器上傳超時。
mysql --max_allowed_packet=1G --net_buffer_length=1M -uroot -p db_name < huge.sql
SET GLOBAL max_allowed_packet = 1073741824; -- 1G
SET GLOBAL net_buffer_length = 1048576; -- 1M
SET GLOBAL innodb_buffer_pool_size = 4G; -- 視內存調大
SET GLOBAL innodb_log_file_size = 1G; -- 需重啟生效
SET GLOBAL innodb_flush_log_at_trx_commit = 2; -- 導入期犧牲持久性換速度
SET GLOBAL sync_binlog = 0; -- 關閉 binlog 同步
SET GLOBAL unique_checks = 0;
SET GLOBAL foreign_key_checks = 0;
SET GLOBAL autocommit = 0;
-- 導入完成後
SET GLOBAL unique_checks = 1;
SET GLOBAL foreign_key_checks = 1;
SET GLOBAL autocommit = 1;
# 按行分卷(每 10 萬行)
split -l 100000 huge.sql part_
# 或按大小
split -b 100M huge.sql part_
# 並行導入(4 線程)
ls part_* | xargs -n1 -P4 -I{} sh -c 'mysql -uroot -p db_name < {}'
# mydumper 並行導出
mydumper -u root -p -d db_name -t 8 -o /backup/export
# myloader 並行導入
myloader -u root -p -d db_name -t 8 -i /backup/export
# 1. 導出時指定字符集
mysqldump --default-character-set=utf8mb4 -uroot -p db_name > dump.sql
# 2. 導入時指定字符集
mysql --default-character-set=utf8mb4 -uroot -p db_name < dump.sql
# 3. 文件編碼驗證
file dump.sql
# 輸出: UTF-8 Unicode text
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| < 50MB、有圖形界面 | phpMyAdmin (調大參數) | 可視化、易操作 |
| > 100MB、Linux 服務器 | mysql 直連 + 參數調優 | 穩定、快速、可腳本化 |
| > 1GB、追求極致速度 | mydumper/myloader 並行 | 多線程、壓縮、斷點續傳 |
| 跨版本遷移 (5.6→8.0) | mysqldump + 兼容性檢查 | 邏輯備份兼容性最佳 |
| 極大庫 (>500GB)、停機窗口短 | xtrabackup 物理備份 + 增量 | 物理拷貝、速度快、不鎖表 |
大數據導入核心原則:**命令行優於圖形界面、流式優於全載入、並行優於串行、參數調優優於默認值**。建立標準化導入 SOP:參數調優 → 校驗編碼 → 試導入(小樣本) → 正式導入 → 驗證行數/檢查約束 → 恢復參數,將風險控制在可接受範圍內。