共用方式為


複寫訂閱者及 Always On 可用性群組 (SQL Server)

適用於:SQL Server

當包含複寫訂閱者資料庫的 Always On 可用性群組容錯移轉時,複寫訂閱可能會失敗。 針對交易式複寫推播訂閱者,若訂用帳戶是使用 AGI 接聽程式名稱建立時,散發代理程式將繼續自動複寫。 針對交易式複寫推播訂閱者,若訂用帳戶是使用 AGI 接聽程式名稱建立且原始訂閱者伺服器已啟動並執行時,散發代理程式將繼續自動複寫。 這是因為散發代理程式作業只會在原始訂閱者 (AG 的原始複本) 上建立。 如果是合併訂閱者,複寫管理員必須透過重新建立訂閱,手動重新設定訂閱者。

支援項目

SQL Server 複寫支援發行者的自動容錯移轉和交易式訂閱者的自動容錯移轉。 合併訂閱者可以成為 AG 的一部分。 然而,故障轉移後,設定新用戶仍需手動操作。 AG 無法與 WebSync 和 SQL Server Compact 案例結合使用。

在可用性群組中建立交易式訂閱

對於異動複寫,請使用下列步驟來設定和容錯移轉訂閱者 AG:

  1. 在建立訂閱之前,將訂閱者資料庫新增至適當的 AG。

  2. 將訂閱者的 AG 接聽程式作為連結的伺服器新增至 AG 的所有節點。 這個步驟可確保所有可能的容錯移轉夥伴都知道且可以連接到接聽程式。

  3. 使用建立異動複寫發送訂閱一節中的指令碼,以訂閱者的 AG 接聽程式名稱來建立訂閱。 故障轉移後,監聽者名稱始終有效,而實際的伺服器名稱則取決於成為新主節點的實際節點。

    注意

    你必須使用 Transact-SQL 腳本來建立訂閱。 你不能用 Management Studio。

  4. 建立提取訂閱:

    1. 使用建立異動複寫發送訂閱一節中的範例指令碼,以訂閱者的 AG 接聽程式名稱來建立訂閱。

    2. 容錯移轉之後,使用 sp_addpullsubscription_agent 預存程序,在新的主要複本上建立散發代理程式作業。

當你在 AG 裡用訂閱資料庫建立拉取訂閱時,每次故障轉移後,你應該在舊主副本上停用分發代理工作,並在新的主副本上啟用該工作。

建立異動複寫發送訂閱

-- commands to execute at the publisher, in the publisher database:
USE [<publisher database name>];
GO

EXEC sp_addsubscription @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @destination_db = N'<subscriber database name>',
    @subscription_type = N'Push',
    @sync_type = N'automatic',
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0;
GO

EXEC sp_addpushsubscription_agent @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @subscriber_db = N'<subscriber database name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

建立異動複寫提取訂閱

-- commands to execute at the subscriber, in the subscriber database:
USE [<subscriber database name>];
GO

EXEC sp_addpullsubscription @publisher = N'<publisher name>',
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @subscription_type = N'pull';
GO

EXEC sp_addpullsubscription_agent @publisher = N'<publisher name>',
    @subscriber = N'<AG listener name or alias>',
    @distributor = N'<distributor AG listener name>', -- this parameter should only be used if the distribution database is part of an AG.
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

可用性群組監聽器需求

當你為 AG 中的訂閱者執行 sp_addpullsubscription_agent 時,必須將參數值傳 @subscriber 給儲存程序,作為 AG 的監聽器名稱。 如果你執行的是 SQL Server 2016(13.x)及更早版本,或是在 CU 16 之前使用的 SQL Server 2017(14.x),儲存程序不會參考 AG 監聽器名稱。 它會建立以執行指令的訂閱伺服器名稱來建立訂閱。 為了解決此問題,請手動將 @subscriber 參數更新為 複寫分發代理程式 上的 AG 監聽器名稱值。

如果用戶 AG 監聽器使用非預設埠,Windows 不支援在參數中提供 AG 監聽器名稱 @subscriber 中的埠號。 作為一個變通方法,你可以使用 SQL Server 2022(16.x)及更新版本的 SQL Server 用戶端網路工具( Aliases,SQL Server Configuration Manager)SQL Server 用戶端網路工具(cliconfg) 為發佈者、分發器和訂閱伺服器建立監聽器和埠的別名,並將別名作為 @subscriber 參數值傳遞。

在訂閱者的可用性群組容錯移轉之後繼續合併代理程式

如果是合併式複寫,複寫管理員必須透過下列步驟手動重新設定訂閱者:

  1. 執行 sp_subscription_cleanup 移除訂閱者的舊訂閱。 在新的主要複本 (原來為次要複本) 上執行此動作。

  2. 從新快照集開始建立新訂閱,重新建立訂閱。

注意

此過程對合併複製訂閱者來說相當不便。 然而,合併複製的主要情境是斷線使用者(桌機、筆電、手機裝置),他們不使用 AG 來連接用戶。