MySQL 資料遷移、備份還原、異構同步的三大核心工具完整指南,含參數詳解、壓縮管道、格式控制、權限需求。
# 1. 單庫/指定表
mysqldump [options] db_name [table1 table2...]
# 2. 多庫
mysqldump [options] --databases db1 db2 db3...
# 3. 所有庫
mysqldump [options] --all-databases
| 參數 | 說明 |
|---|---|
| -u, --user | 用戶名 |
| -p, --password | 密碼 (命令列不安全,建議配置檔) |
| -h, --host | 主機 (預設 localhost) |
| -P, --port | 連接埠 (預設 3306) |
| --single-transaction | InnoDB 一致性備份 (不鎖表) |
| --master-data=2 | 輸出 CHANGE MASTER TO 註解 (主從同步用) |
| -d, --no-data | 僅結構 |
| -t, --no-create-info | 僅資料 |
| --routines | 包含存儲過程/函數 |
| --triggers | 包含觸發器 |
| --events | 包含事件 |
| -e, --extended-insert | 多行 INSERT (預設開啟,加速匯入) |
| --max-allowed-packet | 客戶端緩衝區大小 |
| --net-buffer-length | 網路緩衝區大小 |
| --hex-blob | 二進位欄位用十六進位 |
| --default-character-set | 連線字元集 |
# 1. 完整備份 (含結構+資料+主從資訊)
mysqldump -uroot -p --single-transaction --master-data=2 --routines --triggers --events db_name > backup_$(date +%F).sql
# 2. 僅結構
mysqldump -uroot -p -d db_name > structure.sql
# 3. 壓縮管道備份
mysqldump -uroot -p db_name | gzip > backup_$(date +%F).sql.gz
# 4. 加速匯入參數 (需與目標庫配置一致)
mysqldump -uroot -p db_name -e --max_allowed_packet=1048576 --net_buffer_length=16384 > fast_import.sql
# 5. 遠端備份
mysqldump -h 10.0.0.1 -uroot -p db_name > remote_backup.sql
# 1. 進入 mysql 後 source
mysql -uroot -p db_name
SOURCE /path/backup.sql;
# 2. 管道導入
mysql -uroot -p db_name < backup.sql
# 3. 解壓管道導入
gunzip -c backup.sql.gz | mysql -uroot -p db_name
權限:需 `FILE` 權限,檔案生成在伺服器端,不可覆蓋既有檔案。
SELECT *
FROM mysql.user
INTO OUTFILE '/tmp/user_export.txt'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
權限:需 `FILE` 權限,`LOCAL` 關鍵字表示從客戶端讀取檔案。
LOAD DATA LOCAL INFILE '/tmp/user_export.txt'
INTO TABLE test.user
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 跳過標題行
| 子句 | 導出 (INTO OUTFILE) | 導入 (LOAD DATA) |
|---|---|---|
| FIELDS TERMINATED BY | 欄位分隔符 | 欄位分隔符 |
| FIELDS ENCLOSED BY | 欄位包圍字元 | 欄位包圍字元 |
| FIELDS ESCAPED BY | 跳脫字元 (預設 \\) | 跳脫字元 |
| LINES TERMINATED BY | 行結束符 | 行結束符 |
| LINES STARTING BY | 不支援 | 行開頭前綴 |
| IGNORE n LINES | 不支援 | 跳過前 n 行 |
| 場景 | 推薦方案 | 關鍵參數 |
|---|---|---|
| 單庫 < 10GB | mysqldump + 壓縮管道 | --single-transaction -e | gzip |
| 單庫 10-100GB | mysqldump 分表並行 + 並行導入 | --tables, mydumper/myloader |
| 單庫 > 100GB | 物理備份 (xtrabackup) 或 CSV 並行載入 | xtrabackup --parallel, LOAD DATA 並行 |
| 異構遷移 (MySQL→PG/Oracle) | CSV 中間格式 + 目標端工具 | INTO OUTFILE + COPY/Loader |
| 線上同步 (CDC) | Binlog 解析 (Canal/Debezium/Flink CDC) | --master-data=2 獲取位點 |
-- 目標庫臨時調大 (匯入期間)
SET GLOBAL max_allowed_packet = 1G;
SET GLOBAL net_buffer_length = 1M;
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
SET GLOBAL sync_binlog = 0;
SET GLOBAL unique_checks = 0;
SET GLOBAL foreign_key_checks = 0;
-- 匯入完成後恢復
SET GLOBAL innodb_flush_log_at_trx_commit = 1;
SET GLOBAL sync_binlog = 1;
SET GLOBAL unique_checks = 1;
SET GLOBAL foreign_key_checks = 1;