次の方法で共有


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

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

サポート対象

SQL Server レプリケーションは、パブリッシャーの自動フェールオーバー、トランザクション サブスクライバーの自動フェールオーバー、およびマージ サブスクライバーの手動フェールオーバーをサポートします。 可用性データベース上のディストリビューターのフェールオーバーはサポートされていません。 AlwaysOn は、Websync および ssNoVersion Compact のシナリオと組み合わせることはできません。

マージ プル サブスクリプションのフェールオーバー

可用性グループのフェールオーバー時のプル サブスクリプションは失敗します。これは、サーバー インスタンスの障害によってプライマリ レプリカが使用できなくなっており、プライマリ レプリカをホストするサーバー インスタンスの msdb データベースに格納されたジョブをプル エージェントが見つけることができないためです。

マージ プッシュ サブスクリプションのフェールオーバー

可用性グループのフェールオーバー時のプッシュ サブスクリプションは失敗します。これは、プッシュ エージェントが元のサブスクライバーの元のサブスクリプション データベースに接続できなくなっているためです。

AlwaysOn 環境でトランザクション サブスクリプションを作成する方法

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

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

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

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

    注意

    サブスクリプションは Transact-SQL スクリプトを使用して作成する必要があり、Management Studio を使用して作成することはできません。

  4. プル サブスクリプションを作成する場合:

    1. Management Studio のプライマリ サブスクライバー ノードで、SQL Server エージェント ツリーを開きます。

    2. プル ディストリビューション エージェント ジョブを識別し、そのジョブを編集します。

    3. [エージェントを実行します] ジョブ ステップで、-Publisher と -Distributor の各パラメーターを確認します。 これらのパラメーターに適切な直接サーバーと、パブリッシャーおよびディストリビューター サーバーのインスタンス名が含まれていることを確認します。

    4. -Subscriber パラメーターを、サブスクライバーの可用性グループ リスナーの名前に変更します。

この手順に従ってサブスクリプションを作成した場合、フェールオーバー後には何もする必要がありません。

トランザクション レプリケーションのプッシュ サブスクリプションの作成

-- commands to execute at the publisher, in the publisher database:
use [<publisher database name>]
EXEC sp_addsubscription @publication = N'<publication name>', 
       @subscriber = N'<availability group 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'<availability group listener name>', 
       @subscriber_db = N'<subscriber database name>', 
       @job_login = null, @job_password = null, @subscriber_security_mode = 1;
GO

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

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

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

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

注意

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