トランザクション レプリケーションでのエラーのスキップ
トランザクション レプリケーションでは、ディストリビューションの処理中にエラーが発生した場合、2 つの方法でエラーをスキップできます。
ディストリビューション エージェントの -SkipErrors パラメータを使用すると、特定の種類のエラーをスキップできます。エラーのあるトランザクションはコミットされませんが、その後のトランザクションはコミットされます。
sp_setsubscriptionxactseqno ストアド プロシージャを使用すると、エラーの原因となる 1 つ以上のトランザクションをスキップできます。このオプションは、SQL Server 以外のサブスクライバには使用できません。
重要 |
---|
一般的なレプリケーション処理では、スキップする必要があるようなエラーは発生しないようにする必要があります。エラーのスキップは、エラーの状態、エラーの発生原因、およびエラーのトランザクションまたは特定のトランザクションを解決せずにスキップする必要がある理由を理解したうえで、注意深く行う必要があります。パブリッシャでコミットされたトランザクションをサブスクライバでスキップすると、2 つのノードが完全には同期されなくなり、さらにエラーが発生する可能性があります。 |
-SkipErrors パラメータ
既定では、ディストリビューション エージェントでエラーが発生すると、エージェントが停止します。-SkipErrors パラメータを使用し、予期されるエラーまたはレプリケーションを停止させないエラーを指定すると、エージェントはエラー情報をログに記録し、実行を継続します。たとえば、ディストリビューション エージェントが重複キー違反をログに記録しながら、その後のトランザクションの処理を続行するように指定する場合は、エージェントがエラー 2601 ("一意インデックス '%.*ls' を含むオブジェクト '%.*ls' には重複するキー行を挿入できません。") および 2627 ("制約 '%.*ls' の %ls 違反。オブジェクト '%.*ls' には重複したキーを挿入できません。") をスキップするように指定します。
-SkipErrors 2601;2627
-SkipErrors パラメータを使用するには、一般的には、"データ一貫性エラー時続行" という名前のディストリビューション エージェント プロファイルを使用します。このようにすると、ディストリビューション エージェントは、エラー 2601、2627、および 20598 ("レプリケートされたコマンドを適用しているときに、サブスクライバで行が見つかりませんでした。") をスキップします。詳細については、「レプリケーション エージェント プロファイル」を参照してください。これらの事前定義済みのプロファイル以外に、作成または変更したエージェント プロファイルで、またはコマンド ラインで、パラメータを指定できます。詳細については、以下を参照してください。
レプリケーション エージェント プロファイルを操作する方法 (SQL Server Management Studio)
レプリケーション エージェント コマンド プロンプト パラメータを表示および変更する方法 (SQL Server Management Studio)
重要 |
---|
既定では、トリガは、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 つ以上のトランザクションをスキップする必要がある場合は、次の操作を実行します。
ディストリビューション エージェントが停止した後に、ディストリビュータで sp_helpsubscriptionerrors を実行します。このストアド プロシージャは、列 xact_seqno を返します。この列には、コミット不能な各トランザクションのログ シーケンス番号 (LSN) が含まれます。
パラメータ @xact_seqno の値を指定して、sp_setsubscriptionxactseqno を実行します。すべてのコミット不能なトランザクションをスキップする場合は、sp_helpsubscriptionerrors によって返された最大 LSN を指定します。
詳細については、「sp_setsubscriptionxactseqno (Transact-SQL)」および「sp_helpsubscriptionerrors (Transact-SQL)」を参照してください。