Skip to main content

數據庫遷移:從 MySQL 到 MSSQL 的一步步指引

·321 words·2 mins
Table of Contents

最近有遇到一個需求那就是要將 MySQL 上的資料庫轉移到 MSSQL。
雖然同樣是 SQL 但兩者指令還是有差,很多用法在 MySQL 上可以用,但在 MSSQL 上卻不行。因此無法直接將 MySQL 資料庫匯出的 sql 檔匯入 MSSQL。

以前都是匯出 sql 檔後再慢慢修,看哪邊需要調整就修哪邊,後來受到高人指點才知道原來 microsoft 有提供 MySQL 遷移至 MSSQL 的工具。
官方文件如下:https://learn.microsoft.com/en-us/sql/sql-server/migrate/guides/mysql-to-sql-server?view=sql-server-ver16

以下記錄我在進行 MySQL 遷移時的過程跟遇到的問題:

安裝 SSMA for MySQL
#

SSMA 全名為 SQL Server Migration Assistant for MySQL,顧名思義就是用來協助將 MySQL 資料庫遷移至 MSSQL 的工具。
下載點:https://www.microsoft.com/en-us/download/details.aspx?id=54257
安裝完成後畫面截圖如下:

SSMA-APP.png

安裝 MySQL Drive
#

由於 SSMA 與 MySQL 進行連線時會需要用到 MySQL connect ODBC Driver

SSMA-mysql-drive.png

因此需要安裝 MySQL connect ODBC Driver。
官方載點:https://dev.mysql.com/downloads/connector/odbc/

準備開始遷移
#

開啟 SSMA,會看到上方為 MySQL Meta data 視窗,下面則是 SQL Server 視窗。
在還沒創建 proj 第二排功能鍵是不能按的。 畫面如下:

SSMA-home.png

1. 要先在 SSMA 創建一個 proj
#

點擊左上方 File 中的 New Project 來創建 proj,在創建時要先選擇要 Migrate 的 SQL Server 版本。

SSMA-select-mssql.png

2. 連結 MySQL & MS SQL
#

創建完後點擊 上方 Connect to MySQL 與 Connect to SQL Server,即可連接資料庫。
其中在 MySQL 連結視窗中可以看到 Driver 的選項,如果這邊是空的代表你電腦裡沒有 MySQL connect ODBC Driver。
如果剛裝完還是沒有出現可以重啟電腦看看。

SSMA-connect-mysql.png

連線完後會讓你選擇要載入哪個資料庫,這邊可以選擇自己想要匯入的資料庫。
載入完後在各自的 Meta data 視窗就可以看到資料庫選項。
如下圖:
SSMA-metadata-explorer.png

產生簡報
#

在進行遷移之前 SSMA 有提供一個簡報功能,他會幫你製作轉移的分析報告,報告上會顯示哪邊轉移過去後會有問題。
在 MySQL Metadata 視窗選擇想要遷移的資料庫右鍵點擊 Create Report。

SSMA-create-report.png

點擊創建報告後,他會產生一個報告網站,截圖如下:

SSMA-summary-report.png

side bar 點開可以看到每一個 table 的 Schema
左方為 MySQL Schema 右方則為 MS SQL Schema,如果有出現 warning 與 error 訊息則會出現在 MSSQL 的視窗中。
SSMA-sql-report.png

可以先調整 MySQL 的 Schema 確認遷移都沒問題後,再進行轉移。

以下為本次遇到的相關問題:
#

  1. Foreign keys with different types of columns and referenced columns can not be converted.
    此問題主要的原因是在使用 Laravel 建置主 key 時是使用 UUID,而外 key 是 string (36)
    導致 MySQL 的資料表主 key 會是 char(36)、外 key 是 varchar (36),在 MySQL 中可以進行關聯,但在 MS SQL 中會發生錯誤。
    解決方式:統一主 key 與外 key 的屬性就好。
  2. ON DELETE CASCADE|SET NULL|SET DEFAULT action was changed to NO ACTION to avoid multiple paths in cascaded foreign keys.
    此問題是因為在某張資料表中同時有多個外 key 同時指向同一個父表, 再進行 ON DELETE 行為時有發生衝突。
    解決方式:把 ON DELETE 行為改為 NO ACTION,也就是不執行任何動作,避免產生衝突。

創建 Schema
#

確認完報表沒問題後,就可以來準備建置 schema。
首先要確認轉移的目標資料庫對不對,點擊要移轉的資料庫右方會出現 Schema Mapping 一般來說 SQL Server 都是對應到 [資料庫].dbo,如下圖:

SSMA-schema-mapping.png

確認完對應的資料庫後,即可點擊上方的 Convert Schema ,這時候還不會在 MSSQL 建立資料表與 Schema,而是先產生在 SQL Server Metadata。
在 SQL Server Metadata 的視窗,對目標資料庫點擊右鍵,會發現 Synchronize with Database 選項。
點擊 Synchronize with Database 即可開始建立資料表與匯入 Schema,匯入完成後可以進到 SQL Server 進行確認。
SSMA-synchronize-with-database.png

轉移資料庫
#

建立完資料表後就可以來進行最後的資料移轉。
在 MySQL Metadata 的視窗中對要移轉的資料庫右鍵點擊,會看到一個 Migrate Data 的選項。
點擊 Migrate Data 後會需要再次輸入 MySQL 與 MSSQL 的連線資訊,輸入後就會開始進行移轉。

SSMA-migrate-data.png

以下為轉完後的報告: 如果 Success Rate 都是 100% 那就代表都有成功轉移。
SSMA-migrate-success.png

最後只要去 MSSQL 中確認資料有無都轉移成功即可大功告成。

參考資料:
#

https://learn.microsoft.com/zh-tw/sql/ssma/mysql/installing-ssma-for-mysql-client-mysqltosql?view=sql-server-ver16
https://blog.miniasp.com/post/2014/12/24/SQL-Server-Migration-Assistant-for-MySQL-Tips
https://ithelp.ithome.com.tw/articles/10322324?sc=rss.iron

小P
Author
小P