SQL Server --BCP導出--> 文本文件 --LOAD DATA導入--> MySQL
適合**億級大表**、異構遷移、網路受限環境(中轉檔案)。
bcp "SELECT * FROM db.schema.table" queryout "F:\export\table.txt" -c -t"," -r"\n" -S 1.2.3.4 -U sa -P pass
| 參數 | 含義 | 建議值 |
|---|---|---|
queryout | 用 SQL 查詢導出(支援 JOIN、WHERE) | 複雜查詢必備 |
-c | 字符型存儲,Tab 分欄、換行分行 | 通用首選 |
-t"," | 欄位分隔符 | CSV 用逗號,含逗號欄位需 -c 配合 |
-r"\n" | 行分隔符 | Windows 用 \r\n |
-C 65001 | UTF-8 編碼輸出 | 中文必加,否則亂碼 |
-k | 空值保留 NULL,不填默認值 | 避免隱性資料變更 |
-F n -L m | 導出行範圍 | 分批導出大表 |
LOAD DATA LOCAL INFILE 'F:/export/table.txt'
INTO TABLE target_table
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 若有標題行
| 子句 | 作用 |
|---|---|
LOCAL | 從**客戶端**讀檔(無則從 Server 讀,需 Server 權限) |
REPLACE / IGNORE | 主鍵/唯一鍵衝突:替換 / 跳過 |
FIELDS TERMINATED BY | 欄位分隔符(對應 BCP -t) |
ENCLOSED BY | 欄位包圍字符(雙引號) |
ESCAPED BY | 轉義字符(預設反斜槓) |
LINES TERMINATED BY | 行分隔符(對應 BCP -r) |
IGNORE n LINES | 跳過前 n 行(標題) |
(col1, col2, ...) | 指定導入欄位順序/子集 |
SET col = expr | 導入同時衍生欄位(如 SET create_time = NOW()) |
The used command is not allowed with this MySQL versionmysql --local-infile=1 -u root -p-C 65001,LOAD DATA 加 CHARACTER SET utf8mb4,檔案實際編碼必須為 UTF-8。INSERT SELECT CAST 轉型。REPLACE 覆蓋或 IGNORE 跳過,視業務而定。#!/bin/bash
# export_import.sh
BCP_CMD="bcp \"SELECT * FROM dbo.big_table\" queryout /data/export/big_table.txt -c -t\",\" -r\"\\n\" -C 65001 -S $SRC -U $USR -P $PWD"
MYSQL_CMD="mysql --local-infile=1 -h $DST -u $USR -p$PWD -e \"LOAD DATA LOCAL INFILE '/data/export/big_table.txt' INTO TABLE big_table CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n';\""
$BCP_CMD && $MYSQL_CMD
BCP 導出 + LOAD DATA 導入 是異構大表遷移的「黃金組合」:檔案中轉解耦網路、並行可控、可斷點續傳。關鍵在於**編碼統一(UTF-8)、分隔符對齊、LOCAL 參數、主鍵衝突策略**四項配置一致。