次の方法で共有


レプリケーション サブスクライバーと AlwaysOn 可用性グループ (SQL Server)

適用対象:SQL Server

レプリケーション サブスクライバーであるデータベースを含む AlwaysOn 可用性グループ (AG) がフェールオーバーすると、レプリケーション サブスクリプションが失敗することがあります。 トランザクション レプリケーションのプッシュ サブスクライバーの場合、サブスクリプションが AG リスナー名を使用して作成されていれば、フェールオーバー後にディストリビューション エージェントは自動的にレプリケーションを継続します。 トランザクション レプリケーションのプル サブスクライバーの場合、サブスクリプションが AG リスナー名を使用して作成されており、元のサブスクライバー サーバーが稼働中であれば、フェールオーバー後にディストリビューション エージェントは自動的にレプリケーションを継続します。 これは、ディストリビューション エージェントのジョブは元のサブスクライバー (AG のプライマリ レプリカ) 上でのみ作成されるためです。 マージ サブスクライバーの場合、レプリケーション管理者はサブスクリプションを再作成して、手動でサブスクライバーを再構成する必要があります。

サポート対象

SQL Server レプリケーションでは、パブリッシャーの自動フェールオーバー、およびトランザクション サブスクライバーの自動フェールオーバーがサポートされます。 マージ サブスクライバーは、AG の一部にすることができます。 ただし、フェールオーバー後に新しいサブスクライバーを構成するには、手動操作が必要です。 AG は、WebSync および SQL Server Compact のシナリオと組み合わせることはできません。

可用性グループにトランザクション サブスクリプションを作成する

トランザクション レプリケーションの場合、サブスクライバーの AG を構成およびフェールオーバーするために、次の手順を使用します。

  1. サブスクリプションを作成する前に、適切な AG にサブスクライバー データベースを追加します。

  2. サブスクライバーの AG リスナーを、AG のすべてのノードにリンク サーバーとして追加します。 この手順により、すべての潜在的なフェールオーバー パートナーがそのリスナーを認識し、そのリスナーに接続できるようになります。

  3. 以下の「トランザクション レプリケーションのプッシュ サブスクリプションの作成」セクションのスクリプトを使用して、サブスクライバーの AG リスナーの名前を使用するサブスクリプションを作成します。 フェールオーバー後、リスナー名は常に有効なままになりますが、サブスクライバーの実際のサーバー名は、新しいプライマリになった実際のノードによって異なります。

    Note

    サブスクリプションを作成するには、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 リスナーが既定以外のポートを使用している場合、 @subscriber パラメーターに AG リスナー名の一部としてポート番号を指定することは、Windows ではサポートされていません。 回避策として、エイリアス (SQL Server 構成マネージャー) または SQL Server 2022 (16.x) 以降のバージョンの SQL Server クライアント ネットワーク ユーティリティ ツール (cliconfg) を使用して、パブリッシャー、ディストリビューター、およびサブスクライバー サーバーのリスナーとポートのエイリアスを作成し、エイリアスを @subscriber パラメーター値として渡すことができます。

サブスクライバーの可用性グループがフェールオーバーした後で、マージ エージェントを再開する

マージ レプリケーションでは、レプリケーション管理者が次の手順に従い、手動でサブスクライバーを再構成する必要があります。

  1. sp_subscription_cleanup を実行し、サブスクライバーの古いサブスクリプションを削除します。 この操作は、新しいプライマリ レプリカ (以前のセカンダリ レプリカ) で実行します。

  2. 新しいサブスクリプションを作成し、新しいスナップショットから開始して、サブスクリプションを再作成します。

Note

このプロセスは、マージ レプリケーション サブスクライバーにとって不便です。 ただし、マージ レプリケーションの主なシナリオは、サブスクライバーで AG を使用しない切断されたユーザー (デスクトップ、ラップトップ、ハンドセット デバイス) です。