レプリケーション サブスクライバーと AlwaysOn 可用性グループ (SQL Server)
適用対象: SQL Server
レプリケーション サブスクライバーであるデータベースを含む AlwaysOn 可用性グループ (AG) がフェールオーバーすると、レプリケーション サブスクリプションが失敗することがあります。 トランザクション レプリケーションのプッシュ サブスクライバーの場合、サブスクリプションが AG リスナー名を使用して作成されていれば、フェールオーバー後にディストリビューション エージェントは自動的にレプリケーションを継続します。 トランザクション レプリケーションのプル サブスクライバーの場合、サブスクリプションが AG リスナー名を使用して作成されており、元のサブスクライバー サーバーが稼働中であれば、フェールオーバー後にディストリビューション エージェントは自動的にレプリケーションを継続します。 これは、ディストリビューション エージェントのジョブは元のサブスクライバー (AG のプライマリ レプリカ) 上でのみ作成されるためです。 マージ サブスクライバーの場合、レプリケーション管理者はサブスクリプションを再作成して、手動でサブスクライバーを再構成する必要があります。
サポート対象
SQL Server レプリケーションでは、パブリッシャーの自動フェールオーバー、およびトランザクション サブスクライバーの自動フェールオーバーがサポートされます。 マージ サブスクライバーを AG に含めることは可能ですが、フェールオーバー後に新しいサブスクライバーを構成するには、手動アクションが必要です。 AG は、WebSync および SQL Server Compact のシナリオと組み合わせることはできません。
可用性グループにトランザクション サブスクリプションを作成する
トランザクション レプリケーションの場合、サブスクライバーの AG を構成およびフェールオーバーするために、次の手順を使用します。
サブスクリプションを作成する前に、適切な AG にサブスクライバー データベースを追加します。
サブスクライバーの AG リスナーを、AG のすべてのノードにリンク サーバーとして追加します。 この手順により、すべての潜在的なフェールオーバー パートナーがそのリスナーを認識し、そのリスナーに接続できるようになります。
以下の「トランザクション レプリケーションのプッシュ サブスクリプションの作成」セクションのスクリプトを使用して、サブスクライバーの AG リスナーの名前を使用するサブスクリプションを作成します。 フェールオーバー後、リスナー名は常に有効になるのに対し、サブスクライバーの実際のサーバー名は、新しいプライマリになった実際のノードによって異なります。
Note
サブスクリプションは Transact-SQL スクリプトを使用して作成する必要があります。Management Studio を使用して作成できません。
プル サブスクリプションを作成するには:
「トランザクション レプリケーションのプル サブスクリプションを作成する」セクションのサンプル スクリプトを使用して、サブスクライバーの AG リスナーの名前を使用するサブスクリプションを作成します。
フェールオーバー後、
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
パラメーターを手動で更新します。
サブスクライバーの可用性グループがフェールオーバーした後で、マージ エージェントを再開する
マージ レプリケーションでは、レプリケーション管理者が次の手順に従い、手動でサブスクライバーを再構成する必要があります。
sp_subscription_cleanup
を実行し、サブスクライバーの古いサブスクリプションを削除します。 この操作は、新しいプライマリ レプリカ (以前のセカンダリ レプリカ) で実行します。新しいサブスクリプションを作成し、新しいスナップショットから開始して、サブスクリプションを再作成します。
Note
現在のプロセスはマージ レプリケーション サブスクライバーには不便ですが、マージ レプリケーションの主なシナリオは、サブスクライバーで AG を使用しない未接続のユーザー (デスクトップ、ラップトップ、携帯端末) です。