トランザクション レプリケーションのエラー 20598 のトラブルシューティング

この記事では、トランザクション レプリケーションでエラー 20598 のトラブルシューティングを行う方法と、問題の回避策について説明します。

元の製品バージョン: SQL Server
元の KB 番号: 3066750

トラブルシューティング

この問題をトラブルシューティングするには、次の手順に従います。

  1. サブスクライバーのディストリビューション エージェント上のレプリケーション モニターで、エラーが発生したトランザクション シーケンス番号とコマンド ID を抽出します。

    レプリケーション モニターのエラー メッセージのスクリーンショット。

    注:

    次のクエリを使用して、ディストリビューター サーバーから同じトランザクション シーケンス番号を取得できます。

    クエリ エントリと結果のスクリーンショット。

  2. ディストリビューター サーバー上のトランザクション シーケンス番号にマップされるコマンドを抽出します。 このコマンドのパラメーターとして、手順 1 のトランザクション シーケンス番号を使用します。

    ディストリビューター サーバー上のトランザクション シーケンス番号にマップされるコマンドのスクリーンショット。

  3. 手順 2 の出力から、手順 1 のコマンド ID を使用して失敗しているコマンドを特定します。 結果セットの command_id 列を参照してください。

  4. 発行元に関する記事情報を検証します。 手順 2 から取得したアーティクル ID を使用し、更新しようとしている記事の詳細をチェックします。

    発行元の記事情報の詳細のスクリーンショット。

  5. 発行元の主キーを検証します。

    更新を実行しようとしているテーブルと主キーの値の 2 つの情報があります。 主キーの値を使用してテーブルにクエリを実行し、パブリッシャー データベース上の行を見つけることができます。 例:

    SELECT * FROM tbl_sample WHERE column_name = <primary_key_value>
    
  6. サブスクライバーで問題を確認します。

    サブスクライバー データベースで同じクエリを実行し、パブリッシャー データベースから受け取った結果と比較します。

回避策

この問題を回避するには、次の 2 つの方法を使用します。

  • 欠落している行をサブスクライバーに手動で挿入します。 これにより、ディストリビューション エージェントが失敗したコマンドを再試行し、レプリケーションを進める可能性があります。

    注:

    エラーが増える場合は、サブスクライバーに手動で挿入する必要がある行が他に存在する可能性があります。

  • このエラーをスキップし、残りの変更をレプリケートし続けるようディストリビューション エージェントに指示します。 ディストリビューション エージェントは パラメーターをskiperrors受け入れます。 このパラメーターを使用して、エラー コード 20598 を渡すことができます。 これにより、不足している行を手動で同期する機会を待つ間、レプリケーションのセットアップはそのまま維持される場合があります。

    注:

    続行する前に、参照整合性のダウンストリームの影響と、影響を受けるテーブルに存在するトリガーを慎重に評価する必要があります。

この問題の原因を調査するためのデータ収集

この問題が繰り返し発生する場合は、Microsoft SQL Server サポート チームが問題の原因を特定できるように、分析のために次のデータを収集する必要があります。

  • この問題が発生した場合のディストリビューション データベースのバックアップ。 (これは、エラーが報告された後、サブスクリプションが再初期化される前に行う必要があります)。

  • パブリッシャーとサブスクライバーのトランザクション ログ バックアップ。 (問題が発生した時刻より少なくとも 24 時間前にデータを収集します。

  • パブリッシャー、サブスクライバー、ディストリビューター上のレプリケーション エージェントのアクティビティを示すプロファイラー トレース。 (問題が発生する前にプロファイラーが実行されていることを確認します。理想的には、再インデックス ジョブの開始時刻と同じ時間にプロファイラーを起動する必要があります)。

  • 影響を受けるテーブルと欠落している主キー値を識別するための前の 5 つの手順からの出力。

  • パブリッシャー データベースとサブスクライバー データベースの両方からのカタログ ビューの出力:

    • sys.partition
    • sys.allocation_units
    • Sys.objects
  • レプリケーション エージェント ログの詳細出力。

対処される既知の問題

古いバージョンのSQL Serverでは、次の問題が発生します。