SQL Server Management Studio と Microsoft SQL Server エージェントは、レプリケーション エージェント イベントなどのイベントをアラートを使用して監視する方法を提供します。 SQL Server エージェントは、アラートに関連付けられているイベントの Windows アプリケーション ログを監視します。 このようなイベントが発生した場合、SQL Server エージェントは、定義したタスクを実行したり、指定したオペレーターに電子メールまたはポケットベル メッセージを送信したりすることによって、自動的に応答します。 SQL Server には、タスクの実行やオペレーターへの通知を行うために構成できる、レプリケーション エージェントに関する定義済みのアラートのセットが含まれています。 実行するタスクの定義の詳細については、このトピックの「アラートへの応答の自動化」セクションを参照してください。
コンピューターがディストリビューターとして構成されている場合、次のアラートがインストールされます。
| メッセージ識別子 | 定義済みのアラート | アラートを発動させる原因となる条件 | msdb に追加情報を入力します。sysreplicationalerts |
|---|---|---|---|
| 14150 | レプリケーション: エージェントの成功 | エージェントが正常にシャットダウンします。 | イエス |
| 14151 | レプリケーション: エージェントエラー | エージェントがエラーでシャットダウンします。 | イエス |
| 14152 | レプリケーション: エージェントの再試行 | エージェントは、操作の再試行に失敗した後にシャットダウンします (エージェントでは、サーバーが使用できない、デッドロック、接続エラー、タイムアウトエラーなどのエラーが発生します)。 | イエス |
| 14157 | レプリケーション: 期限切れのサブスクリプションが削除されました | 期限切れのサブスクリプションが削除されました。 | いいえ |
| 20572 | レプリケーション: 検証エラー後にサブスクリプションが再初期化される | 応答ジョブ "データ検証エラー時にサブスクリプションを再初期化する" と、サブスクリプションが正常に再初期化されます。 | いいえ |
| 20574 | レプリケーション: サブスクライバーがデータ検証に失敗しました | ディストリビューションまたはマージ エージェントは、データの検証に失敗します。 | イエス |
| 20575 | レプリケーション: サブスクライバーがデータ検証に合格しました | ディストリビューション エージェントまたはマージ エージェントがデータ検証に合格します。 | イエス |
| 20578 | レプリケーション: エージェントのカスタム シャットダウン | ||
| 22815 | ピアツーピア衝突検出アラート | ディストリビューション エージェントは、ピア ツー ピア ノードで変更を適用しようとしたときに競合を検出しました。 | イエス |
これらのアラートに加えて、レプリケーション モニターには、状態とパフォーマンスに関連する一連の警告とアラートが用意されています。 詳細については、「レプリケーション モニターのアラート インフラストラクチャ でのしきい値と警告の設定 」を参照してください。 詳細については、「 User-Defined イベントの作成」を参照してください。
定義済みのレプリケーション アラートを構成するには
- SQL Server Management Studio: 定義済みのレプリケーション アラートを構成する (SQL Server Management Studio)
アプリケーション ログを直接表示する
Windows アプリケーション ログを表示するには、Microsoft Windows イベント ビューアーを使用します。 アプリケーション ログには、SQL Server エラー メッセージと、コンピューター上の他の多くのアクティビティのメッセージが含まれています。 SQL Server エラー ログとは異なり、SQL Server を起動するたびに新しいアプリケーション ログは作成されません (各 SQL Server セッションは新しいイベントを既存のアプリケーション ログに書き込みます)。ただし、ログに記録されたイベントを保持する期間を指定できます。 Windows アプリケーション ログを表示すると、特定のイベントのログをフィルター処理できます。 詳細については、Windows のマニュアルを参照してください。
アラートへの応答の自動化
レプリケーションは、データ検証に失敗するサブスクリプションの応答ジョブを提供し、アラートに対する追加の自動応答を作成するためのフレームワークも提供します。 応答ジョブのタイトルは、 データ検証の失敗時にサブスクリプションを再初期化 するというタイトルで、SQL Server Management Studio の SQL Server エージェント ジョブ フォルダーに格納されます。 この応答ジョブを有効にする方法については、「 定義済みのレプリケーション アラートの構成 (SQL Server Management Studio)」を参照してください。 トランザクション パブリケーションのアーティクルが検証に失敗した場合、応答ジョブは失敗したアーティクルのみを再初期化します。 マージ パブリケーションのアーティクルが検証に失敗した場合、応答ジョブはパブリケーション内のすべてのアーティクルを再初期化します。
応答を自動化するためのフレームワーク
通常、アラートが発生した場合、アラートの原因と実行する適切なアクションを理解するのに役立つ唯一の情報は、アラート メッセージ自体に含まれます。 この情報を解析すると、エラーが発生しやすく、時間がかかる場合があります。 レプリケーションにより、 sysreplicationalerts システム テーブルにアラートに関する追加情報が提供され、応答の自動化が容易になります。指定された情報は、カスタマイズされたプログラムで簡単に使用できる形式で既に解析されています。
たとえば、サブスクライバー A の Sales.SalesOrderHeader テーブルのデータが検証に失敗した場合、SQL Server はメッセージ 20574 をトリガーして、そのエラーを通知できます。 受信したメッセージは、"サブスクライバー 'A'、パブリケーション 'MyPublication' のアーティクル 'SalesOrderHeader' のサブスクリプションがデータ検証に失敗しました" になります。
メッセージに基づいて応答を作成する場合は、サブスクライバー名、アーティクル名、パブリケーション名、およびメッセージからのエラーを手動で解析する必要があります。 ただし、ディストリビューション エージェントとマージ エージェントは、同じ情報を sysreplicationalerts に書き込むため (エージェントの種類、アラートの時刻、パブリケーション データベース、サブスクライバー データベース、パブリケーションの種類などの詳細と共に)、応答ジョブはテーブルから関連情報を直接照会できます。 正確な行をアラートの特定のインスタンスに関連付けることはできませんが、テーブルには 状態 列があり、これを使用してサービス エントリを追跡できます。 このテーブルのエントリは、履歴保持期間に対して保持されます。
たとえば、サービス警告メッセージ 20574 Transact-SQL で応答ジョブを作成する場合は、次のロジックを使用できます。
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