專案需將 SQL Server 全量遷移至 MySQL。對比兩種方案:MySQL ODBC + SQL Server 匯出精靈 vs PHP ETL 腳本,分析優缺點與適用場景。
ntext、image、xml 等無法直接對應INT 存 Unix Timestamp,來源 DATETIME 直接匯入失敗<?php
// 1. 連接來源 (SQL Server via ODBC)
$src = odbc_connect('web', 'admin', '123456'); // DSN='web'
$cur = odbc_exec($src, 'SELECT * FROM mydb.dbo.[user]');
// 2. 連接目標 (MySQL)
$dst = mysql_pconnect('localhost', 'root', '123456');
mysql_select_db('mydb', $dst);
// 3. 逐列轉寫
while (odbc_fetch_row($cur)) {
$f1 = odbc_result($cur, 1); // id
$f2 = odbc_result($cur, 2); // name
$f3 = odbc_result($cur, 3); // username
$f4 = odbc_result($cur, 4); // password
$f5 = odbc_result($cur, 5); // recdate (DATETIME)
$f5 = timetoint($f5); // 轉 Unix Timestamp
$sql = "INSERT INTO `user` (id,name,username,password,recdate)
VALUES ('$f1','$f2','$f3','$f4','$f5')";
mysql_query($sql, $dst);
}
function timetoint($str) {
list($date, $time) = explode(' ', $str);
list($y,$m,$d) = explode('-', $date);
list($h,$i,$s) = explode(':', $time);
return mktime($h,$i,$s,$m,$d,$y);
}
?>
DATETIME → INT、ntext → TEXT、image → LONGBLOBCOMMIT,避免長事務| 工具 | 適用場景 | 特點 |
|---|---|---|
| MySQL Workbench Migration Wizard | 異構遷移標準化 | GUI、型別對應表、支援 SQL Server/Oracle/PostgreSQL |
| AWS DMS / Azure Database Migration Service | 雲端遷移、CDC 同步 | 全量+增量、任務監控、無伺服器 |
| pt-archiver / gh-ost | 大表線上遷移/重組 | Percona Toolkit、無鎖、可節流 |
| Debezium + Kafka | CDC 即時同步 | 事件驅動、微服務整合 |