複寫訂閱者及 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>',
    @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 接聽程式名稱;其會以執行命令的訂閱者伺服器名稱建立。 如需解決此問題,請使用 AG 接聽程式名稱值,手動更新散發代理程式作業上的 @Subscriber 參數。

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

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

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

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

注意

目前的流程對合併式複寫訂閱者來說很不方便,但是合併式複寫的主要案例是中斷連線的使用者 (桌上型電腦、筆記型電腦、手持式裝置),這些使用者不會在訂閱者上使用 AG。

另請參閱