トランザクション レプリケーションでのエラーのスキップ

トランザクション レプリケーションでは、ディストリビューションの処理中にエラーが発生した場合、2 つの方法でエラーをスキップできます。

  • ディストリビューション エージェントの -SkipErrors パラメーターを使用すると、特定の種類のエラーをスキップできます。エラーのあるトランザクションはコミットされませんが、その後のトランザクションはコミットされます。

  • sp_setsubscriptionxactseqno ストアド プロシージャを使用すると、エラーの原因となる 1 つ以上のトランザクションをスキップできます。このオプションは、SQL Server 以外のサブスクライバーには使用できません。

重要な注意事項重要

一般的なレプリケーション処理では、スキップする必要があるようなエラーは発生しないようにする必要があります。エラーのスキップは、エラーの状態、エラーの発生原因、およびエラーのトランザクションまたは特定のトランザクションを解決せずにスキップする必要がある理由を理解したうえで、注意深く行う必要があります。パブリッシャーでコミットされたトランザクションをサブスクライバーでスキップすると、2 つのノードが完全には同期されなくなり、さらにエラーが発生する可能性があります。

-SkipErrors パラメーター

既定では、ディストリビューション エージェントでエラーが発生すると、エージェントが停止します。-SkipErrors パラメーターを使用し、予期されるエラーまたはレプリケーションを停止させないエラーを指定すると、エージェントはエラー情報をログに記録し、実行を継続します。たとえば、ディストリビューション エージェントが重複キー違反をログに記録しながら、その後のトランザクションの処理を続行するように指定する場合は、エージェントがエラー 2601 ("一意インデックス '%.*ls' を含むオブジェクト '%.*ls' には重複するキー行を挿入できません。") および 2627 ("制約 '%.*ls' の %ls 違反。オブジェクト '%.*ls' には重複したキーを挿入できません。") をスキップするように指定します。

-SkipErrors 2601:2627

-SkipErrors パラメーターを使用するには、一般的には、"データ一貫性エラー時続行" という名前のディストリビューション エージェント プロファイルを使用します。このようにすると、ディストリビューション エージェントは、エラー 2601、2627、および 20598 ("レプリケートされたコマンドを適用しているときに、サブスクライバーで行が見つかりませんでした。") をスキップします。詳細については、「レプリケーション エージェント プロファイル」を参照してください。これらの事前定義済みのプロファイル以外に、作成または変更したエージェント プロファイルで、またはコマンド ラインで、パラメーターを指定できます。詳細については、以下を参照してください。

重要な注意事項重要

既定では、トリガーは、XACT_ABORT 設定が ON になった状態で実行されます。ディストリビューション エージェントがサブスクライバーでの変更を適用している間に、トリガー内のステートメントによってエラーが発生した場合は、個別のステートメントではなく変更部分のバッチ全体が失敗します。トランザクション レプリケーションでは、ディストリビューション エージェントの -SkipErrors パラメーターを使用して、エラーの原因になっているステートメントをスキップできます。XACT_ABORT が ON の状態で -SkipErrors が使用される場合は、ステートメントによってエラーが発生すると、変更部分のバッチ全体がスキップされます。トリガー内で XACT_ABORT を ON に設定する必要がない場合は、-SkipErrors パラメーターを使用する際に XACT_ABORT を OFF に設定することをお勧めします。オプションをオフに設定するには、トリガーの定義で SET XACT_ABORT OFF を指定します。XACT_ABORT の詳細については、「SET XACT_ABORT (Transact-SQL)」を参照してください。

sp_setsubscriptionxactseqno ストアド プロシージャ

sp_setsubscriptionxactseqno ストアド プロシージャを使用して、サブスクライバーで適用されたときにエラーの原因となる 1 つ以上のトランザクションをスキップできます。エラーが発生し、1 つ以上のトランザクションをスキップする必要がある場合は、次の操作を実行します。

  1. ディストリビューション エージェントが停止した後に、ディストリビューターで sp_helpsubscriptionerrors を実行します。このストアド プロシージャは、列 xact_seqno を返します。この列には、コミット不能な各トランザクションのログ シーケンス番号 (LSN) が含まれます。

  2. パラメーター @xact_seqno の値を指定して、sp_setsubscriptionxactseqno を実行します。すべてのコミット不能なトランザクションをスキップする場合は、sp_helpsubscriptionerrors によって返された最大 LSN を指定します。

詳細については、「sp_setsubscriptionxactseqno (Transact-SQL)」および「sp_helpsubscriptionerrors (Transact-SQL)」を参照してください。