先前有寫過一篇文章 - 如何匯出/匯入 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
:剛剛複製下來備用的金鑰Login
及Password
:有權限存取資料庫的使用者名稱及密碼
輸入完畢後,按下「OK
」,如果擔心輸入的資料有錯,我們也可以按一下「Test Connection
」測試看看有沒有問題?
接下來,點擊「Register
」,註冊要參與同步的資料庫。
我們可以選擇 SQL
驗證或 Windows
驗證,在這邊我選擇 Windows 驗證,輸入完「Server
」及「Database
」的資訊之後,點擊「Save
」。
註冊成功的話,我們的資料庫應該出現在列表上,並且狀態是「Reachable
」。
新增內部部署資料庫 - 第二階段
我們回到新增內部部署資料庫的畫面,繼續剛剛未完成的步驟,接著點選「選取資料庫
」。
輸入下列資料:
同步成員名稱
:輸入自己想要的成員名稱連線到此代理程式的內部部署資料庫
:這邊會出現我們在地端註冊的資料庫,選取想要加入同步的資料庫。同步方向
:在這邊我選擇「來自中樞
」
輸入完畢後,按下「確定
」。
確認同步代理程式閘道及資料庫都設定好後,按下「確定
」。
等待內部部署資料庫新增成功後,按下「確定
」。
選取要同步的資料表
接下來,我們要決定要同步的資料表及欄位,點擊「資料表
」。
在開啟的設定畫面中,選擇「中樞資料庫
」,點擊「重新整理結構描述
」,稍待一會兒出現資料表之後,勾選想要加入同步的資料表,在這邊我是全部勾選,然後點擊「儲存
」。
在這邊要注意兩件事:
- 資料表沒有主索引鍵(Primary Key)無法加入同步
- 不支援計算資料行欄位(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 會自動產生一些同步用的資料庫物件,當我們刪除同步群組之後,有時候它不會自己消失,所以當我們發現同步時發生的錯誤是來自於這些資料庫物件的時候,可以試著照著以下的步驟把它們給刪了:
- 在 Azure SQL Database 刪除出問題的同步群組
- 在來源及目的資料庫,刪除所有結構描述是
DataSync
的資料表。 - 在來源及目的資料庫,刪除所有結構描述是
DataSync
的預存程序。 - 在來源及目的資料庫,刪除所有結構描述是
DataSync
的使用者定義資料表類型。 - 到每一個資料表裡面,刪除名稱包含
_dss_insert_trigger
、_dss_delete_trigger
、_dss_update_trigger
的觸發程序。 - 在 Azure SQL Database 重建同步群組
建立資料庫副本資料的方式有很多種,以上介紹的只是其中一種方式,就分享給大家,希望對大家有一丁點的幫助。