[料理佳餚] 使用 SQL Data Sync Agent 同步 Azure SQL Database 到地端的資料庫

先前有寫過一篇文章 - 如何匯出/匯入 Azure SQL Database 的資料庫?,透過這種方式,我們可以將 Azure SQL Database 資料庫的資料還原到地端,除此之外還有其他的方式可以將雲端資料庫的資料弄一份到地端,此篇文章要來介紹另一種方式是使用 SQL Data Sync Agent 來同步資料。

新增同步群組

我們先前往 Azure SQL Database 裡面,在想要進行同步的資料庫管理介面中,點擊「同步至其他資料庫」,接著點擊「新的同步群組」。

在開啟的頁面中,我們逐一輸入:

  • 同步群組名稱:輸入自己想要的群組名稱
  • 同步中繼資料的資料庫:即資料庫 Metadata 的來源,通常是來源資料庫。
  • 自動同步:選擇開啟的話,可以指定同步頻率,最小的單位是秒,這邊我選擇關閉,以手動的方式執行同步。
  • 衝突辦法:當資料發生衝突時的解決辦法
  • 使用者名稱密碼:有權限存取資料庫的使用者名稱及密碼
  • 使用私人連結:打勾的話,微軟會幫忙在同步的來源資料庫與目的資料庫之間,建立一條私人的安全連線。

輸入完畢之後,我們按下「確定」。

因為我們剛剛勾選了使用私人連結,所以我們還要做「核准私人端點連線」的動作,在畫面中有一個「按一下這裡以核准私人端點連線。」的超連結,點下去。

在隨後開啟的畫面中,切換到「私人存取」,應該會看到有一個連線狀態為 Pending 的私人端點,勾選之後點擊「核准」,然後在確認的視窗中點擊「」,同步群組就新增成功了。

新增內部部署資料庫 - 第一階段

我們回到同步至其他資料庫的設定頁面,點擊一下剛剛建立的同步群組。

進到同步群組的設定畫面之後,點擊「資料庫」。

在這邊我們可以選擇其他在 Azure 的資料庫,如果是地端資料庫的話,請點擊「新增內部部署資料庫」,然後點選「選擇同步代理程式閘道」。

由於我們是第一次使用,所以選擇「建立新的代理程式」,輸入自己想要的「代理程式名稱」,點擊「建立並產生金鑰」,金鑰產生後務必將其複製下來備用,最後點擊「確定」。

安裝 SQL Data Sync Agent

到這邊我們暫時離開 Azure 的後台,到地端的伺服器,然後到這裡下載 SQL Data Sync Agent,安裝好後,把它開起來,點擊「Submit Agent Key」。

輸入下列資料:

  • Agent Key:剛剛複製下來備用的金鑰
  • LoginPassword:有權限存取資料庫的使用者名稱及密碼

輸入完畢後,按下「OK」,如果擔心輸入的資料有錯,我們也可以按一下「Test Connection」測試看看有沒有問題?

接下來,點擊「Register」,註冊要參與同步的資料庫。

我們可以選擇 SQL 驗證或 Windows 驗證,在這邊我選擇 Windows 驗證,輸入完「Server」及「Database」的資訊之後,點擊「Save」。

註冊成功的話,我們的資料庫應該出現在列表上,並且狀態是「Reachable」。

新增內部部署資料庫 - 第二階段

我們回到新增內部部署資料庫的畫面,繼續剛剛未完成的步驟,接著點選「選取資料庫」。

輸入下列資料:

  • 同步成員名稱:輸入自己想要的成員名稱
  • 連線到此代理程式的內部部署資料庫:這邊會出現我們在地端註冊的資料庫,選取想要加入同步的資料庫。
  • 同步方向:在這邊我選擇「來自中樞

輸入完畢後,按下「確定」。

確認同步代理程式閘道及資料庫都設定好後,按下「確定」。

等待內部部署資料庫新增成功後,按下「確定」。

選取要同步的資料表

接下來,我們要決定要同步的資料表及欄位,點擊「資料表」。

在開啟的設定畫面中,選擇「中樞資料庫」,點擊「重新整理結構描述」,稍待一會兒出現資料表之後,勾選想要加入同步的資料表,在這邊我是全部勾選,然後點擊「儲存」。

在這邊要注意兩件事:
  1. 資料表沒有主索引鍵(Primary Key)無法加入同步
  2. 不支援計算資料行欄位(Computed Column)

還有其他的需求及限制,這個部分可以參考微軟官方的文件

同步

所有的準備工作都已經就緒了,剩下就是按下「同步」,讓 Azure 將資料同步到地端的資料庫。

過程當中,我們可以點擊「重新整理記錄檔」來查看目前的同步進度,如果有出錯,錯誤訊息也會在記錄裡面。

如果我們在記錄裡面看到 Sync completed successfully in xxx seconds. 的文字,代表同步成功了。

疑難排解

整個從頭到尾的設定過程,我重複了大概三~四遍,其中有一遍遭遇到一段這樣的錯誤,特別把它記錄下來:

Database provisioning failed with the exception "Cannot insert the value NULL into column 'provision_timestamp', table 'XXX.DataSync.provision_marker_dss'; column does not allow nulls. INSERT fails.The statement has been terminated.Inner exception: SqlException ID: f0a62b60-02dc-41c8-a1fd-e1cf341f76db, Error Code: -2146232060 - SqlError Number:515, Message: Cannot insert the value NULL into column 'provision_timestamp', table ' XXX.DataSync.provision_marker_dss'; column does not allow nulls. INSERT fails. SqlError Number:3621, Message: SQL error with code 3621 For more information, provide tracing ID ‘1db5f4a9-9c0d-4cac-807b-08499d168a2d’ to customer support."

這是因為 Azure SQL Database 會自動產生一些同步用的資料庫物件,當我們刪除同步群組之後,有時候它不會自己消失,所以當我們發現同步時發生的錯誤是來自於這些資料庫物件的時候,可以試著照著以下的步驟把它們給刪了:

  1. 在 Azure SQL Database 刪除出問題的同步群組
  2. 在來源及目的資料庫,刪除所有結構描述是 DataSync 的資料表。
  3. 在來源及目的資料庫,刪除所有結構描述是 DataSync 的預存程序。
  4. 在來源及目的資料庫,刪除所有結構描述是 DataSync 的使用者定義資料表類型。
  5. 到每一個資料表裡面,刪除名稱包含 _dss_insert_trigger_dss_delete_trigger_dss_update_trigger 的觸發程序。
  6. 在 Azure SQL Database 重建同步群組

建立資料庫副本資料的方式有很多種,以上介紹的只是其中一種方式,就分享給大家,希望對大家有一丁點的幫助。

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學