萬盛學電腦網

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

SQL Server 到 MySQL 資料遷移:圖形化工具 DTS + phpMyAdmin 實戰教學

遷移架構選型

方案適用場景優點缺點
SQL Server DTS/SSIS + 文字檔中轉一次性離線遷移、資料量中等 (<10GB)、異構平台圖形化、無需寫代碼、支援型別映射轉換需中間檔案落地、大資料量耗時、增量同步困難
Linked Server + OPENQUERY同網段、頻繁同步、資料量小即時查詢、可寫入效能差、配置複雜、穩定性一般
第三方 ETL (Talend, Kettle, DataX)定期同步、大資料量、複雜轉換功能強、支援增量、分散式學習曲線陡峭、部署運維成本高
CDC 工具 (Debezium, Canal, Maxwell)即時同步、微服務解耦、異構複寫毫秒級延遲、不侵入業務架構複雜、需 Kafka/RocketMQ 配合

方案一:SQL Server DTS (SQL 2000/2005) / SSIS (2008+) 導出文字檔

  1. 建立 DTS 封裝:企業管理器 → 資料轉換服務 → 新建封裝。
  2. 配置來源連線:選擇「Microsoft OLE DB Provider for SQL Server」,指定伺服器、認證、資料庫。
  3. 配置目的地連線:選擇「Text File (Destination)」,指定輸出目錄 (如 D:\Export\),格式選 **UTF-8**、**逗號分隔 (CSV)**、**第一行列名**。
  4. 建立「轉換資料」任務:拖曳來源表 → 目的地檔案,欄位映射自動匹配,手動調整型別 (如 datetime→string、bit→int)。
  5. 執行封裝:監控進度,完成後檢查錯誤日誌。
  6. 多表批次:重複上述步驟,或使用「複製資料庫精靈」/ SSIS Foreach 迴圈容器批次處理。

方案二:直接匯出 INSERT 腳本 (SSMS / sqlcmd)

-- SSMS: 右鍵資料庫 → 任務 → 產生指令碼 → 進階 → 要編寫指令碼的資料類型 = "結構描述和資料"
-- 輸出單一 .sql 檔,含 CREATE TABLE + INSERT VALUES
-- 注意:大資料量會產生超大檔案,SSMS 可能記憶體不足

MySQL 端匯入:phpMyAdmin 圖形化操作

場景 A:目標表不存在 (全新建表)

  1. phpMyAdmin → 選擇目標資料庫 → 「匯入」標籤。
  2. 選擇 CSV 檔案,格式選 **CSV using LOAD DATA**。
  3. 關鍵設定:
    • 字元集:utf8mb4
    • 欄位分隔符:,
    • 欄位包圍符:"
    • 跳過第一行:1 (含標題列)
    • 資料表名稱:指定目標表名 (若不存在將自動建立)。
  4. 點擊「執行」,完成後檢查行數。

場景 B:目標表已存在 (結構不同/欄位順序不同)

  1. 建立暫存表 tmp_import 結構與 CSV 完全一致。
  2. 匯入 CSV 至 tmp_import。
  3. 執行 INSERT INTO target_table (col1, col2, ...) SELECT col1, col2, ... FROM tmp_import;
  4. 驗證無誤後 DROP TABLE tmp_import;

場景 C:大檔案超過 phpMyAdmin 上傳限制

  • 修改 php.ini:upload_max_filesize=100M, post_max_size=100M, memory_limit=256M, max_execution_time=300。
  • 或分割檔案:split -l 50000 large.csv part_,分批匯入。
  • **最佳方案**:使用命令列 mysql -u user -p db_name --local-infile=1 -e "LOAD DATA LOCAL INFILE '/path/file.csv' INTO TABLE tbl FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;" (需客戶端/伺服器啟用 local_infile=1)。

型別映射對照表 (SQL Server → MySQL)

SQL ServerMySQL 建議備註
bitTINYINT(1) / BOOLEANMySQL 無原生 BIT(1) 索引友善
tinyintTINYINT UNSIGNED
smallintSMALLINT
intINT
bigintBIGINT
decimal(p,s)DECIMAL(p,s)
money/smallmoneyDECIMAL(19,4) / DECIMAL(10,4)固定 4 位小數
float/realFLOAT / DOUBLE
datetime/smalldatetimeDATETIME / TIMESTAMPMySQL 5.6.4+ 支援微秒
date/timeDATE / TIME
char/ncharCHAR(n) / CHAR(n CHAR)nchar 雙位元組
varchar/nvarcharVARCHAR(n) / VARCHAR(n CHAR)
text/ntextTEXT / MEDIUMTEXT / LONGTEXTntext 雙位元組
image/varbinary(max)BLOB / MEDIUMBLOB / LONGBLOB
uniqueidentifierCHAR(36) / BINARY(16)UUID/GUID
xmlJSON (5.7+) / TEXT

遷移後驗證清單

  1. 核心表 COUNT(*)、CHECKSUM TABLE 對比。
  2. 抽樣比對關鍵業務欄位 (金額、日期、狀態、外鍵關聯)。
  3. 執行應用端冒煙測試:查詢、新增、修改、刪除、報表。
  4. 檢查自增值衝突:SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA='db' AND TABLE_NAME='tbl'; 必須 > 現有最大 ID。
  5. 索引、外鍵、觸發器、預存程序、視圖完整遷移。
copyright © 萬盛學電腦網 all rights reserved