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

SQL Server 遷移至 MySQL 實戰經驗與方案對比

     編輯:MySQL 資料庫相關知識

遷移背景

需將 SQL Server 資料庫完整遷移至 MySQL。調研後嘗試兩種方案,現對比心得:

方案一:ODBC + SQL Server 匯出精靈

操作流程

  1. 安裝 MySQL ODBC Driver
  2. SQL Server Management Studio → 匯出資料 → 選擇 MySQL ODBC 資料源

缺點與坑點

  • 資料型別不相容:ntext、image 等型別無法直接寫入 MySQL
  • 時間型別衝突:目標表使用 INT 存時間戳,匯入時型別衝突
  • 產生表結構不理想:欄位型別自動映射往往不符合預期
  • 不可控性強:難以在遷移過程中進行資料清洗/轉換
結論:僅適合簡單測試環境,生產遷移不推薦。

方案二:腳本程式化遷移(PHP/ASP) - 推薦

核心優勢

  • 完全掌控欄位映射、型別轉換、資料清洗邏輯
  • 可分批、斷點續傳、錯誤重試
  • 支援複雜業務轉換(如時間格式轉換、編碼處理)

PHP 遷移範例

<?php
$cnx = odbc_connect('web', 'admin', '123456');  // SQL Server DSN
$cur = odbc_exec($cnx, 'SELECT * FROM user');

$conn = mysql_pconnect('localhost', 'root', '123456');
mysql_select_db('mydb', $conn) or die('無法連接 MySQL');

while (odbc_fetch_row($cur)) {
    $field1 = odbc_result($cur, 1);  // id
    $field2 = odbc_result($cur, 2);  // name
    $field3 = odbc_result($cur, 3);  // username
    $field4 = odbc_result($cur, 4);  // password
    $field5 = odbc_result($cur, 5);  // recdate (datetime)
    $field5 = timetoint($field5);    // 轉換為時間戳
    
    $sql = "INSERT INTO user (id,name,username,password,recdate) 
            VALUES ('$field1','$field2','$field3','$field4','$field5')";
    mysql_query($sql, $conn);
}

function timetoint($str) {
    list($date, $time) = explode(' ', $str);
    list($year, $month, $day) = explode('-', $date);
    list($hour, $minute, $second) = explode(':', $time);
    return mktime($hour, $minute, $second, $month, $day, $year);
}
?>

ASP 遷移範例

<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "web", "admin", "123456"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT ID, name, username, password, recdate FROM user", conn

Set mysql = Server.CreateObject("ADODB.Connection")
mysql.Open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=mydb;UID=root;PWD=123456;"

Do While Not rs.EOF
    recdate = DateDiff("s", "1970-01-01", rs("recdate"))  // 轉時間戳
    sql = "INSERT INTO user (id,name,username,password,recdate) VALUES (" & _
          rs("ID") & ",'" & rs("name") & "','" & rs("username") & "','" & rs("password") & "'," & recdate & ")"
    mysql.Execute sql
    rs.MoveNext
Loop
%>

遷移最佳實踐總結

  1. 先在 MySQL 建立目標表結構(手寫 DDL 確保型別精確)
  2. 編寫遷移腳本處理資料轉換邏輯
  3. 分批遷移,驗證資料筆數與關鍵欄位一致性
  4. 保留遷移日誌,支援回滾與審計
  5. 上線前進行壓力測試與業務驗收
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved