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