異構資料庫遷移首選:SQL Server 連結伺服器 + MySQL ODBC 驅動,無需中間文件,支援千萬級大表分批遷移。
MySQL_LinkEXEC sp_addlinkedserver @server = 'MYSQL_LINK', @srvproduct = 'MySQL', @provider = 'MSDASQL', @datasrc = 'MySQL_Link'; -- 系統 DSN 名稱 EXEC sp_addlinkedsrvlogin @rmtsrvname = 'MYSQL_LINK', @useself = 'FALSE', @locallogin = NULL, @rmtuser = 'mysql_user', @rmtpassword = 'mysql_pass';
-- 1. 建立目標表結構(MySQL 端預先建好,或用 SSMS 生成腳本手動調整型別對應)
-- 型別映射關鍵:
-- BIGINT → BIGINT
-- DATETIME2 → DATETIME(6)
-- NVARCHAR → VARCHAR (utf8mb4)
-- UNIQUEIDENTIFIER → CHAR(36)
-- BIT → TINYINT(1)
-- 2. 分批寫入(避免單次事務過大、鎖表、記憶體溢出)
DECLARE @BatchSize INT = 50000;
DECLARE @MaxId BIGINT = (SELECT MAX(Id) FROM src_table);
DECLARE @StartId BIGINT = 0;
WHILE @StartId <= @MaxId
BEGIN
INSERT INTO OPENQUERY(MYSQL_LINK, 'SELECT col1, col2, col3 FROM target_table')
SELECT col1, col2, col3
FROM src_table
WHERE Id > @StartId AND Id <= @StartId + @BatchSize;
SET @StartId = @StartId + @BatchSize;
-- 可選:WAITFOR DELAY '00:00:01' 降低壓力
END
| SQL Server | MySQL | 備註 |
|---|---|---|
| BIGINT | BIGINT | |
| INT | INT | |
| BIT | TINYINT(1) | |
| DECIMAL(p,s) | DECIMAL(p,s) | |
| DATETIME / DATETIME2 | DATETIME(6) | 精度對齊 |
| NVARCHAR(n) | VARCHAR(n*2) | utf8mb4 字元集 |
| VARCHAR(n) | VARCHAR(n) | |
| VARBINARY(MAX) | LONGBLOB | |
| UNIQUEIDENTIFIER | CHAR(36) | 存 UUID 字串 |
Charset=utf8mb4、SQL Server 端 N'字串' 明確 Unicode。AUTO_INCREMENT,遷移時不寫入 ID,或用 SET @id=0; UPDATE ... SET id=@id:=@id+1 重排。BACKUP LOG。PacketSize、分批次。