遷移架構選型
| 方案 | 適用場景 | 優點 | 缺點 |
| 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+) 導出文字檔
- 建立 DTS 封裝:企業管理器 → 資料轉換服務 → 新建封裝。
- 配置來源連線:選擇「Microsoft OLE DB Provider for SQL Server」,指定伺服器、認證、資料庫。
- 配置目的地連線:選擇「Text File (Destination)」,指定輸出目錄 (如
D:\Export\),格式選 **UTF-8**、**逗號分隔 (CSV)**、**第一行列名**。
- 建立「轉換資料」任務:拖曳來源表 → 目的地檔案,欄位映射自動匹配,手動調整型別 (如
datetime→string、bit→int)。
- 執行封裝:監控進度,完成後檢查錯誤日誌。
- 多表批次:重複上述步驟,或使用「複製資料庫精靈」/ SSIS Foreach 迴圈容器批次處理。
方案二:直接匯出 INSERT 腳本 (SSMS / sqlcmd)
-- SSMS: 右鍵資料庫 → 任務 → 產生指令碼 → 進階 → 要編寫指令碼的資料類型 = "結構描述和資料"
-- 輸出單一 .sql 檔,含 CREATE TABLE + INSERT VALUES
-- 注意:大資料量會產生超大檔案,SSMS 可能記憶體不足
MySQL 端匯入:phpMyAdmin 圖形化操作
場景 A:目標表不存在 (全新建表)
- phpMyAdmin → 選擇目標資料庫 → 「匯入」標籤。
- 選擇 CSV 檔案,格式選 **CSV using LOAD DATA**。
- 關鍵設定:
- 字元集:
utf8mb4
- 欄位分隔符:
,
- 欄位包圍符:
"
- 跳過第一行:
1 (含標題列)
- 資料表名稱:指定目標表名 (若不存在將自動建立)。
- 點擊「執行」,完成後檢查行數。
場景 B:目標表已存在 (結構不同/欄位順序不同)
- 建立暫存表
tmp_import 結構與 CSV 完全一致。
- 匯入 CSV 至
tmp_import。
- 執行
INSERT INTO target_table (col1, col2, ...) SELECT col1, col2, ... FROM tmp_import;
- 驗證無誤後
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 Server | MySQL 建議 | 備註 |
| bit | TINYINT(1) / BOOLEAN | MySQL 無原生 BIT(1) 索引友善 |
| tinyint | TINYINT UNSIGNED | |
| smallint | SMALLINT | |
| int | INT | |
| bigint | BIGINT | |
| decimal(p,s) | DECIMAL(p,s) | |
| money/smallmoney | DECIMAL(19,4) / DECIMAL(10,4) | 固定 4 位小數 |
| float/real | FLOAT / DOUBLE | |
| datetime/smalldatetime | DATETIME / TIMESTAMP | MySQL 5.6.4+ 支援微秒 |
| date/time | DATE / TIME | |
| char/nchar | CHAR(n) / CHAR(n CHAR) | nchar 雙位元組 |
| varchar/nvarchar | VARCHAR(n) / VARCHAR(n CHAR) | |
| text/ntext | TEXT / MEDIUMTEXT / LONGTEXT | ntext 雙位元組 |
| image/varbinary(max) | BLOB / MEDIUMBLOB / LONGBLOB | |
| uniqueidentifier | CHAR(36) / BINARY(16) | UUID/GUID |
| xml | JSON (5.7+) / TEXT | |
遷移後驗證清單
- 核心表
COUNT(*)、CHECKSUM TABLE 對比。
- 抽樣比對關鍵業務欄位 (金額、日期、狀態、外鍵關聯)。
- 執行應用端冒煙測試:查詢、新增、修改、刪除、報表。
- 檢查自增值衝突:
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA='db' AND TABLE_NAME='tbl'; 必須 > 現有最大 ID。
- 索引、外鍵、觸發器、預存程序、視圖完整遷移。