搭配 Azure SQL 受控執行個體的異動複寫

適用於:Azure SQL 受控執行個體

異動複寫是 Azure SQL 受控執行個體和 SQL Server 的一項功能,可讓您將 Azure SQL 受控執行個體或 SQL Server 執行個體中一個資料表的資料,複寫到遠端資料庫上的資料表。 此功能可讓您同步處理不同資料庫中的多個資料表。

概觀

您可以使用異動複寫將 Azure SQL 受控執行個體中的變更發送至:

  • SQL Server 資料庫 (位於內部部署環境或 Azure 虛擬機器)
  • Azure SQL 資料庫中的資料庫
  • Azure SQL 受控執行個體中的執行個體資料庫

注意

若要使用 Azure SQL 受控執行個體的所有功能,您必須使用最新版的 SQL Server Management Studio (SSMS)SQL Server Data Tools (SSDT)

單元

異動複寫中的主要元件是發行者散發者訂用帳戶,如下圖所示:

Diagram of replication with Azure SQL.

角色 Azure SQL Database Azure SQL 受控執行個體
發行者
散發者
提取訂用帳戶
發送訂用帳戶

發行者將更新傳送至散發者,以發行某些資料表 (發行項) 的變更。 發行者可以是 Azure SQL 受控執行個體或 SQL Server 執行個體。

散發者從發行者的發行項中收集變更,然後發行至訂用帳戶。 散發者可以是 Azure SQL 受控執行個體或 SQL Server 執行個體 (與發行者版本相同或更高的任何版本)。

訂用帳戶接收發行者上的變更。 SQL Server 執行個體和 Azure SQL 受控執行個體都可以是發送和提取訂用帳戶,但是,當散發者是 Azure SQL 受控執行個體,而訂用帳戶不是時,不支援提取訂用帳戶。 Azure SQL 資料庫中的資料庫只能是發送訂用帳戶。

從下列 SQL Server 版本起,Azure SQL 受控執行個體支援作為訂用帳戶:

注意

針對其他不支援發行到 Azure 中物件的 SQL Server 版本,可利用重新發行資料方法將資料移動到版本較新的 SQL Server。

嘗試使用舊版設定複寫可能會導致錯誤 MSSQL_REPL20084 (處理序無法連線到訂用帳戶) 和 MSSQL_REPL40532 (無法開啟登入要求的伺服器<名稱>。登入失敗)。

複寫類型

複寫有不同類型

複寫 Azure SQL Database Azure SQL 受控執行個體
標準異動 是 (僅作為訂用帳戶)
快照式 是 (僅作為訂用帳戶)
合併式複寫
對等
雙向
可更新的訂用帳戶

支援性對照表

Azure SQL 受控執行個體與 SQL Server 的異動複寫支援性對照表相同。

發行者 散發者 訂用帳戶
SQL Server 2022 SQL Server 2022 SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2019 SQL Server 2022
SQL Server 2019
SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2017 SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2016 SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2014 SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2008 R2
SQL Server 2008
SQL Server 2012 SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2008 R2
SQL Server 2008
SQL Server 2008 R2
SQL Server 2008
SQL Server 2022
SQL Server 2019
SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2008 R2
SQL Server 2008
SQL Server 2014
SQL Server 2012
SQL Server 2008 R2
SQL Server 2008

使用時機

異動複寫對於下列情況非常有用:

  • 發行資料庫中一或多個資料表中的變更,並散發至已訂用帳戶變更的 SQL Server 執行個體或 Azure SQL 資料庫中的一或多個資料庫。
  • 讓數個散發資料庫處於同步狀態。
  • 持續發行變更,以此將資料庫從一個 SQL Server 執行個體或 Azure SQL 受控執行個體遷移至另一個資料庫。

比較資料同步與異動複寫

類別 資料同步 異動複寫
優點 - 主動-主動支援
- 在內部部署與 Azure SQL 資料庫之間雙向進行
- 更低的延遲性
- 異動一致性
- 移轉後重複使用現有的拓撲
缺點 - 無異動一致性
- 更高的效能影響
- 無法從 Azure SQL 資料庫發佈
- 高維護成本

一般設定

一般情況下,發行者和散發者必須位在雲端或內部部署中。 不支援下列設定:

發行者與本機散發者在 SQL 受控執行個體上

Single instance as Publisher and Distributor.

發行者和散發者都設定在單一 SQL 受控執行個體上,並將變更散發至其他另一個 SQL 受控執行個體、SQL Database 或 SQL Server 執行個體。

發行者與遠端散發者在 SQL 受控執行個體上

在此設定中,一個 SQL 受控執行個體將變更發行至另一個 SQL 受控執行個體上的散發者,此散發者可服務許多來源 SQL 受控執行個體,並將變更散發至 Azure SQL Database、Azure SQL 受控執行個體或 SQL Server 上的一或多個目標。

Separate instances for Publisher and Distributor.

在兩個受控執行個體上設定發行者和散發者。 這種設定有一些限制:

  • 兩個受控執行個體都在相同的 vNet 上。
  • 這兩個受控執行個體位於相同的位置。

內部部署發行者/散發者與遠端訂用帳戶

Azure SQL Database as subscriber.

在此設定中,Azure SQL 資料庫或 Azure SQL 受控執行個體中的資料庫是訂用帳戶。 此設定支援從內部部署移轉至 Azure。 如果訂用帳戶是 Azure SQL 資料庫中的資料庫,則必須處於發送模式。

規格需求

  • 對複寫參與者之間的連線使用 SQL 驗證。
  • 使用 Azure 儲存體帳戶共用作為複寫使用的工作目錄。
  • 在子網路安全性規則中開啟 TCP 輸出連接埠 445,以存取 Azure 檔案共用。
  • 當 SQL 受控執行個體是發行者/散發者,而訂用帳戶不是時,開啟 TCP 輸出連接埠 1433。 您也可能需要在 SQL 受控執行個體 NSG 輸出安全性規則中,將連接埠 1433 目的地服務標籤allow_linkedserver_outboundvirtualnetwork 變更為 internet
  • 將發行者和散發者都放在雲端,或都放在內部。
  • 如果複寫參與者的虛擬網路不同,則在虛擬網路之間設定 VPN 對等互連。

注意

當散發者是 Azure SQL 受控執行個體資料庫,且訂用帳戶為內部部署時,如果輸出網路安全性群組 (NSG) 連接埠 445 遭到封鎖,則您連線至 Azure 儲存體檔案時可能會遇到錯誤 53。 更新 vNet NSG 以解決此問題。

限制

異動複寫具 Azure SQL 受控執行個體特有的部分限制。 透過本節深入瞭解這些限制。

Azure 儲存體帳戶不會刪除快照檔案

Azure SQL 受控執行個體會針對用於異動複寫的快照檔案運用使用者設定的 Azure 儲存體帳戶。 Azure SQL 受控執行個體不同於內部部署環境的 SQL Server,其不會從 Azure 儲存體帳戶刪除快照檔案。 若不再需要檔案,您應該將其刪除。 這可透過 Azure 入口網站的 Azure 儲存體介面、Microsoft Azure 儲存體總管,或命令列用戶端 (Azure PowerShell 或 CLI) 或 Azure 儲存體 Management REST API 來完成。

以下範例說明如何刪除檔案,以及如何刪除空白資料夾。

az storage file delete-batch --source <file_path> --account-key <account_key> --account-name <account_name>
az storage directory delete --name <directory_name> --share-name <share_name> --account-key <account_key> --account-name <account_name>

持續執行的散佈代理程式數目

在 Azure SQL 受控執行個體,設定為持續執行的散佈代理程式數目限制為 30 個。 若要擁有更多散佈代理程式,其須視需要執行,或具已定義排程。 排程可以每 10 秒 (或更長) 以每日頻率與發生次數來定義,因此即使其非連續進行,您仍可擁有散佈者來引入僅數秒的延遲。 當需要大量散佈者時,建議使用已排程且非連續設定。

關於容錯移轉群組

支援搭配容錯移轉群組的執行個體使用異動複寫。 然而,如果您在新增 SQL 受控執行個體至容錯移轉群組之前設定複寫,則當您開始建立容錯移轉群組時,複寫會暫停,且複寫監視器會顯示 Replicated transactions are waiting for the next log backup or for mirroring partner to catch up 狀態。 在成功建立容錯移轉群組之後,複寫就會繼續。

如果發行者散佈者 SQL 受控執行個體在容錯移轉群組,則在發生容錯移轉之後,SQL 受控執行個體管理員必須清除舊主要複本的所有發行內容,並在新主要複本加以重新設定。 在此情況下需要下列活動:

  1. 停止資料庫上執行的所有複寫作業 (如果有的話)。

  2. 在發行者資料庫上執行下列指令碼,從發行者卸除訂用帳戶中繼資料。 取代 <name of publication><name of subscriber> 值:

    EXEC sp_dropsubscription @publication = '<name of publication>',
        @article = 'all',
        @subscriber = '<name of subscriber>'
    
  3. 從訂用帳戶卸除訂用帳戶中繼資料。 在訂用帳戶 SQL 受控執行個體的訂用帳戶資料庫上,執行下列指令碼。 取代 <full DNS of publisher> 值。 例如:example.ac2d23028af5.database.windows.net

    EXEC sp_subscription_cleanup
       @publisher = N'<full DNS of publisher>',
       @publisher_db = N'<publisher database>',
       @publication = N'<name of publication>';
    
  4. 在已發行的資料庫中執行下列指令碼,以強制從發行者卸除所有複寫物件:

    EXEC sp_removedbreplication;
    
  5. 強制從原始主要 SQL 受控執行個體卸除舊散佈者 (如果容錯移轉回復至原本擁有散佈者的舊主要複本)。 在舊散佈者 SQL 受控執行個體的 master 資料庫,執行下列指令碼:

    EXEC sp_dropdistributor 1, 1;
    

如果訂用帳戶 SQL 受控執行個體在容錯移轉群組中,則應該將發行集設定為連線至訂用帳戶 SQL 受控執行個體的容錯移轉群組接聽程式端點。 發生容錯移轉時,SQL 受控執行個體管理員的後續動作取決於發生的容錯移轉類型:

  • 如果容錯移轉不遺失資料,則容錯移轉之後,複寫繼續運作。
  • 如果容錯移轉遺失資料,複寫也會正常運作。 將再次複寫遺失的變更。
  • 如果容錯移轉遺失資料,不過是在散發資料庫保留期間之外遺失資料,則 SQL 受控執行個體管理員必須重新初始化訂用帳戶資料庫。

常見問題疑難排解

異動記錄及異動複寫

在一般情況,異動記錄用於針對資料庫記錄資料變更。 變更會記錄在異動記錄,這會導致記錄儲存體耗用量成長。 另外還有一自動程式可允許安全截斷異動記錄,且此程式可減少記錄使用的儲存空間。 當設定異動複寫的發行時,除非記錄讀取器工作處理記錄檔的變更,否則會防止截斷異動記錄。 在某些情況,異動記錄的處理會遭到有效封鎖,且該狀態可能導致填滿保留給異動記錄的整個儲存體。 當異動記錄無可用空間亦無可成長空間時,異動記錄即滿。 在此狀態,資料庫無法再處理任何寫入工作負載,且實際上會變成唯讀資料庫。

已停用的記錄讀取器代理程式

異動複寫發行有時會針對資料庫進行設定,但未設定為執行記錄讀取器代理程式。 在此情況,異動記錄會累積變更,且不會進行處理。 這會導致異動記錄持續成長,最後會滿額。 使用者應確定記錄讀取器工作存在且作用中。 如果不需要,替代方式是停用異動複寫。

記錄讀取器代理程式查詢逾時

有時由於重複查詢逾時,記錄讀取器工作無法取得有效進度。 修正查詢逾時的方法是針對記錄讀取器代理程式工作增加查詢逾時設定。

使用 SSMS 可增加記錄讀取器工作的查詢逾時。 在 [物件總管] 的 [SQL Server Agent],尋找您要修改的工作。 先停止該工作,然後開啟其屬性。 尋找 step 2,然後加以編輯。 使用 -QueryTimeout <timeout_in_seconds> 附加命令值。 對於查詢逾時值,請嘗試 21600 或更高。 最後,再次啟動工作。

記錄儲存體大小達到 2 TB 最大限制

當異動記錄儲存體大小達到上限,也就是 2 TB 時,記錄實際上無法成長超過此限制。 在此情況,唯一可用的緩解措施是標示要複寫的所有異動為已處理,以便允許截斷異動記錄。 這實際上表示不會複寫記錄的剩餘異動,且您需要重新初始化複寫。

注意

在執行緩解措施之後,您必須重新初始化複寫,這表示再次複寫整個資料集集。 這是資料集作業的大小,而且可能長時間執行,具體視應複寫的資料集量而定。

若要執行此緩解措施,您必須先停止散佈者的記錄讀取器代理程式。 然後,您應執行 sp_repldone 預存程序,並將發行者資料庫的 reset 旗標設為 1,以便允許截斷異動記錄。 這個命令如下方 EXEC sp_repldone @xactid = NULL, @xact_seqno = NULL, @numtrans = 0, @time = 0, @reset = 1 所示。 在此之後,您必須重新初始化複寫。

下一步

如需有關設定異動複寫的詳細資訊,請參閱下列教學課程:

另請參閱