萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server → MySQL 資料遷移實戰:BCP 導出 + LOAD DATA 導入全流程指南

整體架構

SQL Server --BCP導出--> 文本文件 --LOAD DATA導入--> MySQL

適合**億級大表**、異構遷移、網路受限環境(中轉檔案)。

步驟 1:SQL Server BCP 導出

核心指令

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 65001UTF-8 編碼輸出中文必加,否則亂碼
-k空值保留 NULL,不填默認值避免隱性資料變更
-F n -L m導出行範圍分批導出大表

步驟 2:MySQL LOAD DATA 導入

核心指令

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())

常見問題與解決

  1. The used command is not allowed with this MySQL version
    啟動客戶端加參數:mysql --local-infile=1 -u root -p
  2. 中文亂碼
    BCP 加 -C 65001,LOAD DATA 加 CHARACTER SET utf8mb4,檔案實際編碼必須為 UTF-8。
  3. 資料類型不匹配
    目標表欄位定義與檔案欄位順序、型別嚴格對齊;必要時先導入暫存表(全 VARCHAR),再 INSERT SELECT CAST 轉型。
  4. 主鍵衝突
    用 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 參數、主鍵衝突策略**四項配置一致。

copyright © 萬盛學電腦網 all rights reserved