レプリケーション エージェント イベントに対する警告の使用

適用対象: SQL Server

SQL Server Management Studio および Microsoft SQL Server エージェントでは、レプリケーション エージェント イベントなどのイベントを、警告を使用して監視する方法が用意されています。 SQL Server エージェントでは、警告に関連するイベントに対し、Windows アプリケーション ログを監視します。 このようなイベントが発生すると、SQL Server エージェントは、定義されたタスクを実行したり、電子メールまたはポケットベルのメッセージを指定したオペレーターに送信したりして、自動的に応答します。 SQL Server には、タスクを実行したりオペレーターに通知すしたりするように設定できる、レプリケーション エージェントに対する一連の定義済みの警告が含まれます。 実行するタスクの定義の詳細については、「警告への応答の自動化」を参照してください。

次の警告は、コンピューターをディストリビューターとして構成したときにインストールされます。

メッセージ ID 定義済みの警告 警告を表示する原因となった条件 msdb..sysreplicationalerts に追加情報を入力します。
14150 レプリケーション: エージェントが成功しました エージェントが正常にシャットダウンされました。 はい
14151 レプリケーション: エージェントが失敗しました エージェントがエラーでシャットダウンされました。 はい
14152 レプリケーション: エージェントを再試行します 操作の再試行が成功せず、エージェントはシャットダウンされました (エージェントが、サーバーの利用不能、デッドロック、接続の失敗、タイムアウト障害などのエラーを検出しました)。 はい
14157 レプリケーション: 有効期限の切れたサブスクリプションを削除しました 有効期限の切れたサブスクリプションが削除されました。 いいえ
20572 レプリケーション: データ検証で問題が見つかった後、サブスクリプションが再初期化されました 応答ジョブ "データ検証で問題が見つかったサブスクリプションの再初期化" でサブスクリプションが正常に再初期化されました。 いいえ
20574 レプリケーション: サブスクライバーでデータ検証で問題が見つかりました ディストリビューション エージェントまたはマージ エージェントはデータの検証で問題が見つかりました。 はい
20575 レプリケーション: サブスクライバーでデータ検証を正常に終了しました ディストリビューション エージェントまたはマージ エージェントはデータの検証を正常に終了しました。 はい
20578 レプリケーション: エージェントのカスタム シャットダウン データ検証が sp_publication_validation によって呼び出され、@shutdown_agent1 に設定されている場合、検証が完了した後、ディストリビューション エージェントはシャットダウンされます。 はい
22815 ピア ツー ピア競合検出の警告 ピア ツー ピア ノードで変更を適用しようとしたときにディストリビューション エージェントで競合が検出されました。 はい

これらの警告に加え、レプリケーション モニターでは、ステータスおよびパフォーマンスに関連する一連の警告を使用できます。 詳細については、「 Set Thresholds and Warnings in Replication Monitor」を参照してください。 SQL Server 警告システムを使用して、他のレプリケーション イベントの警告を定義することもできます。 詳細については、「ユーザー定義イベントの作成」を参照してください。

定義済みのレプリケーションの警告を構成するには

アプリケーション ログの直接表示

Windows アプリケーション ログを表示するには、Microsoft Windows イベント ビューアーを使用します。 アプリケーション ログには SQL Server のエラー メッセージだけでなく、コンピューターのその他多くの利用状況に関するメッセージが含まれます。 SQL Server エラー ログとは異なり、SQL Server を起動するたびに新しいアプリケーション ログが作成されることはありません (SQL Server の各セッションでは、既存のアプリケーション ログに新しいイベントを書き込みます)。ただし、ログに記録されたイベントを保有する期間を指定できます。 Windows アプリケーション ログを表示するときに、特定のイベントのログをフィルター選択できます。 詳細については、Windows のマニュアルを参照してください。

アラートへの対応を自動化する

レプリケーションでは、データ検証に失敗するサブスクリプションに対する応答ジョブ、および自動化された警告への応答を追加作成するためのフレームワークが用意されています。 応答ジョブは、データ検証で問題が見つかったサブスクリプションの再初期化というタイトルが付けられ、SQL Server Management StudioにあるSQL Server エージェントの [ジョブ] フォルダーに保存されます。 この応答ジョブを有効にする方法の詳細については、「Configure Predefined Replication Alerts (SQL Server Management Studio)」を参照してください。 トランザクション パブリケーション内のアーティクルが検証に失敗すると、応答ジョブは、その失敗したアーティクルのみを再初期化します。 マージ パブリケーション内のアーティクルが検証に失敗すると、応答ジョブは、パブリケーション内のすべてのアーティクルを再初期化します。

応答の自動化のためのフレームワーク

通常では、警告が表示された場合、警告の原因と実行する適切な操作を知るのに役立つ唯一の情報は、警告自体に含まれています。 この情報の解析は間違いやすく、時間がかかります。 レプリケーションでは、sysreplicationalerts システム テーブルで警告についての追加情報が提供され、応答の自動化を容易にしています。提供される情報は、既に解析済みで、カスタマイズしたプログラムで簡単に使用できます。

たとえば、サブスクライバー A の Sales.SalesOrderHeader テーブルのデータが検証に失敗した場合、SQL Server は、その失敗を通知するメッセージ 20574 を表示します。 "パブリケーション 'MyPublication' のアーティクル 'SalesOrderHeader' に対するサブスクライバー 'A' のサブスクリプションで、データ検証に失敗しました" というメッセージが表示されます。

このメッセージに基づいた応答を作成する場合は、サブスクライバー名、アーティクル名、パブリケーション名、およびエラーをメッセージから手動で解析する必要があります。 しかし、ディストリビューション エージェントおよびマージ エージェントは sysreplicationalerts に同じ情報 (加えて、エージェントの種類、警告の時刻、パブリケーション データベース、サブスクライバー データベース、パブリケーションの種類などの詳細) を書き込みます。このため、応答ジョブではテーブルから関連情報を直接クエリできます。 正確な行を警告の特定のインスタンスへ関連付けることはできませんが、このテーブルにある status 列を使用して、対象となるエントリを追跡できます。 このテーブルのエントリは、履歴の保有期間の間、維持されます。

たとえば、Transact-SQL で警告メッセージ、20574 を対象とする応答を作成する場合、次のロジックを使用します。

declare @publisher sysname, @publisher_db sysname, @publication sysname, @publication_type int, @article sysname, @subscriber sysname, @subscriber_db sysname, @alert_id int  
declare hc cursor local for select publisher, publisher_db, publication, publication_type, article, subscriber,   
  subscriber_db, alert_id from   
  msdb..sysreplicationalerts where  
  alert_error_code = 20574 and status = 0  
  for read only  
open hc  
fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id  
while (@@fetch_status <> -1)  
begin  
/* Do custom work  */  
/* Update status to 1, which means the alert has been serviced. This prevents subsequent runs of this job from doing this again */  
update msdb..sysreplicationalerts set status = 1 where alert_id = @alert_id  
 fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id  
end  
close hc  
deallocate hc