最近有遇到一個需求那就是要將 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
安裝完成後畫面截圖如下:
安裝 MySQL Drive #
由於 SSMA 與 MySQL 進行連線時會需要用到 MySQL connect ODBC Driver
因此需要安裝 MySQL connect ODBC Driver。
官方載點:https://dev.mysql.com/downloads/connector/odbc/
準備開始遷移 #
開啟 SSMA,會看到上方為 MySQL Meta data 視窗,下面則是 SQL Server 視窗。
在還沒創建 proj 第二排功能鍵是不能按的。
畫面如下:
1. 要先在 SSMA 創建一個 proj #
點擊左上方 File 中的 New Project 來創建 proj,在創建時要先選擇要 Migrate 的 SQL Server 版本。
2. 連結 MySQL & MS SQL #
創建完後點擊 上方 Connect to MySQL 與 Connect to SQL Server,即可連接資料庫。
其中在 MySQL 連結視窗中可以看到 Driver 的選項,如果這邊是空的代表你電腦裡沒有 MySQL connect ODBC Driver。
如果剛裝完還是沒有出現可以重啟電腦看看。
連線完後會讓你選擇要載入哪個資料庫,這邊可以選擇自己想要匯入的資料庫。
載入完後在各自的 Meta data 視窗就可以看到資料庫選項。
如下圖:
產生簡報 #
在進行遷移之前 SSMA 有提供一個簡報功能,他會幫你製作轉移的分析報告,報告上會顯示哪邊轉移過去後會有問題。
在 MySQL Metadata 視窗選擇想要遷移的資料庫右鍵點擊 Create Report。
點擊創建報告後,他會產生一個報告網站,截圖如下:
side bar 點開可以看到每一個 table 的 Schema
左方為 MySQL Schema 右方則為 MS SQL Schema,如果有出現 warning 與 error 訊息則會出現在 MSSQL 的視窗中。
可以先調整 MySQL 的 Schema 確認遷移都沒問題後,再進行轉移。
以下為本次遇到的相關問題: #
- 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 的屬性就好。 - 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,如下圖:
確認完對應的資料庫後,即可點擊上方的 Convert Schema ,這時候還不會在 MSSQL 建立資料表與 Schema,而是先產生在 SQL Server Metadata。
在 SQL Server Metadata 的視窗,對目標資料庫點擊右鍵,會發現 Synchronize with Database 選項。
點擊 Synchronize with Database 即可開始建立資料表與匯入 Schema,匯入完成後可以進到 SQL Server 進行確認。
轉移資料庫 #
建立完資料表後就可以來進行最後的資料移轉。
在 MySQL Metadata 的視窗中對要移轉的資料庫右鍵點擊,會看到一個 Migrate Data 的選項。
點擊 Migrate Data 後會需要再次輸入 MySQL 與 MSSQL 的連線資訊,輸入後就會開始進行移轉。
以下為轉完後的報告:
如果 Success Rate 都是 100% 那就代表都有成功轉移。
最後只要去 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