大型 SQL 檔案 (數十 MB 以上) 透過 phpMyAdmin 匯入極易逾時/斷線。命令列 mysql 客戶端配合 SOURCE 或輸入重導向,穩定、高效、支援大檔案。本文提供標準化操作流程,重點解決**中文編碼設定**與**路徑處理**兩大坑點。
backup.sql。scp backup.sql user@db-server:/tmp/
ssh user@db-server
mysql -u dbuser -p # 輸入密碼進入 mysql>
CREATE DATABASE IF NOT EXISTS target_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE target_db;
SET NAMES utf8;
-- 錯誤寫法:SET NAMES utf-8; -- 會導致中文亂碼
-- 錯誤寫法:SET CHARACTER SET utf8; -- 僅影響字元集,不影響排序規則,仍可能亂碼
-- 方式 A: SOURCE 指令 (在 mysql> 內部,支援 Tab 自動完成路徑)
SOURCE /tmp/backup.sql;
-- 方式 B: 輸入重導向 (在 Shell 直接執行,不進入 mysql>)
mysql -u dbuser -p target_db < /tmp/backup.sql
-- 需預先 SET NAMES utf8 不可行,改用:
mysql -u dbuser -p --default-character-set=utf8 target_db < /tmp/backup.sql
backup.sql。SET NAMES gbk;。# 進入 mysql 安裝 bin 目錄
cd C:\Program Files\MySQL\MySQL Server 5.7\bin
# 匯入 (路徑含空格需加雙引號)
mysql -u root -p --default-character-set=utf8 target_db < "D:\Backup\backup.sql"
# 或在 mysql> 內
SOURCE "D:\Backup\backup.sql";
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 中文亂碼 (??? / 亂碼字元) | SET NAMES 設定與檔案實際編碼不符 | 用編輯器確認檔案編碼,對應設定 SET NAMES |
| ERROR 2006 (MySQL server has gone away) | 單條 INSERT 過大 / 逾時 | 調大 max_allowed_packet (如 64M)、拆分檔案 |
| ERROR 1062 (Duplicate entry) | 主鍵/唯一鍵衝突 | 匯出時加 --add-drop-table 或目標表先 TRUNCATE |
| Access denied | 權限不足 | GRANT ALL ON target_db.* TO 'user'@'host'; |
SET SESSION sql_log_bin = 0; (需 SUPER 權限)。SET FOREIGN_KEY_CHECKS = 0; (匯入後改回 1)。SET UNIQUE_CHECKS = 0; (匯入後改回 1)。mysqlpump (5.7.8+) 並行匯入/匯出。掌握命令列匯入標準流程,大檔案遷移從「整晚等待、祈禱不斷線」變為「喝杯咖啡、驗證完成」的從容體驗。