首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 到 MySQL 數據遷移:DTS 導出文本 + LOAD DATA 免代碼實戰

     編輯:MySQL 資料庫相關知識

適用場景

  • Windows 環境、已安裝 SQL Server 客戶端 + MySQL 圖形工具 (phpMyAdmin/MySQL Workbench)
  • 中小數據量、一次性遷移、不想寫代碼/腳本
  • 表結構相對簡單、類型映射可手工調整

工具鏈

  1. SQL Server DTS (Data Transformation Services) / SSIS:導出文本文件
  2. MySQL LOAD DATA INFILE / phpMyAdmin「從文本導入」:高速導入

操作流程

階段一:SQL Server 導出文本 (DTS Wizard)

  1. 企業管理器 → 右鍵資料庫 → 所有任務 → 匯出資料
  2. 資料來源:Microsoft OLE DB Provider for SQL Server
  3. 目的地:Text File (目的地),指定輸出目錄
  4. 新建任務 → 轉換資料任務,連接源表與目標文本文件
  5. 屬性映射:逐欄確認源/目標欄位、數據類型、分隔符
  6. 執行 → 成功 → 保存包 (可複用/調度)
  7. 進階:選擇「從源資料庫複製表和視圖」導出結構腳本

階段二:MySQL 建表並導入

  1. 在 MySQL 中按導出結構建表 (或用導出的 DDL 腳本調整類型後執行)
  2. phpMyAdmin → 目標表 → 導入 → 選擇文本文件
  3. 關鍵設置:
    • 分隔符:, 或 \t (與導出一致)
    • 字符集:utf8mb4 (防亂碼)
    • 跳過第一行 (含標題)
    • FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\\\' LINES TERMINATED BY '\r\n'
  4. 執行導入,驗證行數

場景三:表已存在、欄位名/順序不一致

  1. 建臨時表 staging_xxx 結構與文本完全一致 → 導入
  2. MySQL 導出 INSERT INTO target SELECT ... FROM staging_xxx (列名顯式映射)
  3. 或文本編輯器批量替換列名、調整順序 → 直接導入目標表
  4. 清理臨時表

關鍵坑點與對策

問題原因解決
導入行數少於導出行終止符不匹配 (CRLF vs LF)、引號未轉義統一 LINES TERMINATED BY '\r\n';ESCAPED BY '\\\\'
數據截斷/報錯目標列長度不足、類型不兼容 (如 ntext→VARCHAR)預調整目標表結構:TEXT/LONGTEXT/BLOB
自增主鍵衝突導入數據含 ID,目標表 AUTO_INCREMENT 衝突導入前 SET FOREIGN_KEY_CHECKS=0; ALTER TABLE t AUTO_INCREMENT=1; 或導出時排除 ID 列
編碼亂碼SQL Server Unicode,MySQL latin1 默認全鏈路 utf8mb4:DSN、表、連接、文件編碼
大文件導入超時phpMyAdmin 上傳限制 (upload_max_filesize/memory_limit)命令行 LOAD DATA LOCAL INFILE;或分割文件 split -l 100000

現代化替代 (推薦)

  • MySQL Workbench Migration Wizard:圖形化、類型映射智能、支援增量同步
  • SSIS + ADO.NET Destination:直接寫入 MySQL,無中間文本
  • Azure DMS / AWS DMS:托管 CDC、近零停機
  • mydumper/myloader:多線程並行導出導入,大表加速 5-10x

結語

DTS + 文本 + LOAD DATA 是 Windows 早期異構遷移的「萬金油」組合,**免代碼、可視化、易調試**,但對編碼、分隔符、類型映射極度敏感。生產遷移建議:小表走圖形化驗證流程,大表走命令行並行工具,全量驗證用 Checksum/行數/抽樣三重保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved