The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

SQL Server Migration Assistant v5.3 for MySQL 使用心得分享

這兩個月竟然有兩次機會幫客戶從 MySQL 轉到 SQL Server 上,一次負責轉移資料到雲端的 SQL Database 上,另一次負責移轉資料到本地的 SQL Server 上,這兩次我都是用 Microsoft SQL Server Migration Assistant v5.3 for MySQL 來執行移轉任務,轉換的過程中遇到了不少問題,所以特地撰文紀錄,以免日後再次遇到相同的困擾。

其實 MySQL 與 SQL Server 這兩種資料庫差異蠻大的,先撇除開發時期 SQL 語法的差異,那完全是另外一個課題,本篇文章主要專注在如何將 MySQL 資料庫完整且正確的移轉到 SQL Server 裡。要移轉資料庫,透過 Microsoft SQL Server Migration Assistant v5.3 for MySQL 來移轉,應該是算是最方便的了,而且一次可以移轉多個資料庫,如果熟悉他的操作介面,就可以很有效率地完成移轉工作,完全不用寫轉檔程式。

我基本上將移轉任務區分為以下步驟:

  1. 下載並安裝相關工具與軟體 ( MySQL Connector/ODBC 5.1SSMA v5.3 for MySQL )
  2. 準備來源資料庫 (MySQL)
  3. 修正 ZERO DATE 且 NOT NULL 的資料
  4. 準備目的資料庫 ( 建議使用 LocalDB 來進行資料轉檔任務 )
  5. 開啟 SSMA for MySQL 工具
    1. 建立新專案
    2. 連接 MySQL 資料庫
    3. 連接 SQL Server 資料庫
    4. 執行 Create Report
    5. 執行 Convert Schema
    6. 執行 Synchorize with Database
    7. 執行 Migrate Data
  6. 備份轉換成功的資料庫
  7. 移除資料庫中的擴充屬性
  8. 將資料庫移轉到 Azure SQL Database

 

步驟 1:下載並安裝相關工具與軟體

請先安裝好 MySQL Connector/ODBC 5.1 以上版本,以及 Microsoft SQL Server Migration Assistant v5.3 for MySQL 工具。

 

步驟 2:準備來源資料庫 (MySQL)

如果你的電腦可以連上 MySQL 就不用特別準備,否則你可能要先將資料庫匯出,並匯入到本機 MySQL 伺服器中,這樣可以加快移轉的速度。

 

步驟 3:修正 ZERO DATE 且 NOT NULL 的資料

由於 MySQL 早期都有許多所謂的 ZERO DATE 的日期格式,也就是 '0000-00-00' 這樣的日期,通常會用在當日期欄位不為空值,而又沒有日期資料的情況,就會塞入這種無效的日期格式。

由於 SQL Server 並不支援 ZERO DATE 這種格式,所以只要資料表中有這類的日期資料,那是一定無法移轉資料成功的,所以我會選擇在轉換資料前,先針對這些資料做一些修正,例如執行以下 SQL 命令:

UPDATE wp_posts SET post_date_gmt='1900-01-01 00:00:00' where post_date_gmt < '1900-01-01';
UPDATE wp_posts SET post_modified_gmt='1900-01-01 00:00:00' where post_modified_gmt < '1900-01-01';

 

步驟 4:準備目的資料庫

建議大家多多利用 LocalDB 來進行資料轉檔任務,因為 LocalDB 不但輕量,而且速度也不差,很適合用來做暫時性的資料庫操作。

有時你也可以先把資料庫給建立好,等等轉移的時候,就可以直接將 MySQL 資料庫直接應對到你預先建立的 SQL Server 資料庫之中。

 

步驟 5:開啟 Microsoft SQL Server Migration Assistant v5.3 for MySQL 工具

接著就準備進入 SSMA for MySQL 工具的使用教學,請先開啟 SSMA for MySQL 工具。

  1. 建立新專案

    請選擇目的地的 SQL Server 資料庫版本:

  2. 連接 MySQL 資料庫

    注意:Provider 請務必選擇 “Unicode” 版本的 Driver 喔!

    SSMA for MySQL 工具預設幫你做好了所有欄位類型的對應表,但你可以修改這個對應,在這套工具裡,預設會把 MySQL 的 datetime 對應到 SQL Server 的 datetime2 型態,但我通常我不太愛用 datetime2 資料型態,所以我會修改 Type Mapping 將 MySQL 的 datetime 對應到 SQL Server 的 datetime 型態就好,這時你可以參考下圖設定:

  3. 連接 SQL Server 資料庫

    這個步驟你可以隨便選一個資料庫來連線,但不一定要把 MySQL 資料庫匯入到這個 SQL Server 資料庫中,重要的是你連線的這個身分是否有足夠的權限可以建立新資料庫。如果你權限不夠,那可能就要先請 DBA 將資料庫先建立好,然後再建立資料庫連接。

    如果你打算在本機直接完成所有移轉動作,那麼你可以忽略以下這個訊息:

  4. 執行 Create Report
    這個步驟就要先選擇你有哪些 MySQL 資料庫要移轉過去,請先勾選起來。勾選完之後,你也可以修改 Schema Mapping 設定,其實就是哪個 MySQL 資料庫要對應到哪一個 SQL Server 資料庫的意思。
    以下圖為例,Source Schema 的 wordpress 就是 MySQL 中的資料庫名稱 (Database Name),而 Target Schema 的 wordpress.dbo 代表的則是 wordpress 資料庫下的 dbo 結構描述,也就代表 MySQL 中 wordpress 資料庫中所有表格,都會匯入成 SQL Server 中 wordpress 資料庫的 dbo 結構描述中。

    接著你就可以建立報表

    這裡的「報表」指的是【幫你檢查在轉換資料庫的過程中,預計會有多少表格可以成功被移轉】,而且還可以在這個介面看到 MySQL 與 SQL Server 之間在建立表格時的 SQL 語法比較。


  5. 執行 Convert Schema
    確認轉換過程沒有大問題之後,就要開始轉換 Schema 了。
    image
    當你按下 Convert Schema 之後,並不會真的到你的 SQL Server 建立資料庫與資料表,而是先幫你產生 SQL Server Metadata 而已:
    SNAGHTML155cb745

  6. 執行 Synchorize with Database
    請在建立好 SQL Server Metadata 之後,直接在 SQL Server Metadata Explorer 窗格中的該資料庫上按下滑鼠右鍵,並選擇 Synchorize with Database 動作,這個動作就會真的連接到你的 SQL Server 並且將資料庫、結構描述物件與資料表物件都給建立起來。
    image

    當你在上圖按下 OK 之後,SQL Server 就會真的被建立起新的資料庫與資料表物件了,只是沒有資料而已:

  7. 執行 Migrate Data
    最後你只要在要轉換的 MySQL 資料庫上按下滑鼠右鍵,並選擇 Migrate Data 即可開始移轉資料:

    這時他還會要求你再次輸入密碼,不過重點還是在 Provider 喔!記得選 Unicode 這個 Driver!!
    image
    image
    最後你會得到一個轉換結果報告,如果都是 100% 的話,那就恭喜你轉換成功啦! ^_^
    image

 

步驟 6:備份轉換成功的資料庫

通常我轉換完畢後,會先將資料庫備份起來。

 

步驟 7:移除資料庫中的擴充屬性

如果你要移轉資料庫到雲端的 SQL Database 裡面,建議還是檢查一下是否有不支援的擴充屬性,詳細操作步驟請參考我的另一篇文章:從本地 SQL 資料庫遷移到雲端 SQL Database 的注意事項

 

步驟 8:將資料庫移轉到 Azure SQL Database

最後一��,才是將資料庫完整遷移到雲端 SQL Database 資料庫裡。

切記:千萬不要直接從 SSMA for MySQL 工具將 MySQL 資料移轉到雲端 SQL Database,因為這樣移轉的效率是最差的!

 

相關連結