レプリケーション サブスクライバーと 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>',
    @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. 新しいサブスクリプションを作成し、新しいスナップショットから開始して、サブスクリプションを再作成します。

Note

現在のプロセスはマージ レプリケーション サブスクライバーには不便ですが、マージ レプリケーションの主なシナリオは、サブスクライバーで AG を使用しない未接続のユーザー (デスクトップ、ラップトップ、携帯端末) です。

関連項目