レプリケートされたデータの検証
トランザクション レプリケーションとマージ レプリケーションを使用すると、サブスクライバのデータがパブリッシャのデータと一致するかどうかを検証できます。検証は、1 つのパブリケーションの特定のサブスクリプション、またはすべてのサブスクリプションに対して行うことができます。次のいずれかの種類の検証を指定すると、ディストリビューション エージェントまたはマージ エージェントは次回の実行時にデータを検証します。
- 行数のみ。サブスクライバのテーブルにパブリッシャのテーブルと同じ数の行があるかどうかを検証しますが、行の内容が一致するかどうかについては検証しません。行数の検証は、データに関する問題に注意を促す手軽な手段として利用できます。
- 行数とバイナリ チェックサム。パブリッシャとサブスクライバの行数に加え、Microsoft SQL Server 2000 で導入されたチェックサム アルゴリズムを使用して、すべてのデータのチェックサムが計算されます。行数の検証で失敗となった場合、チェックサムは実行されません。
- 行数とチェックサム。このオプションは非推奨であり、Microsoft SQL Server Version 7.0 を実行するサブスクライバでのみ使用するようにしてください。行数とバイナリ チェックサムと同じ手法を使用しますが、SQL Server Version 7.0 で使用可能なチェックサム アルゴリズムを利用します。詳細については、このトピックの「データ検証の動作」を参照してください。
サブスクライバとパブリッシャのデータが一致するかどうかの検証に加え、マージ レプリケーションでは、各サブスクライバに対してデータが正しくパーティション分割されているかどうかを検証する機能も用意されています。詳細については、「マージ サブスクライバのパーティション情報の検証」を参照してください。
データを検証するには
サブスクリプションのすべてのアーティクルを検証するには、SQL Server Management Studio、ストアド プロシージャ、またはレプリケーション管理オブジェクト (RMO) を使用します。スナップショット パブリケーションおよびトランザクション パブリケーションの個々のアーティクルを検証するには、ストアド プロシージャを使用する必要があります。
- Microsoft SQL Server Management Studio: サブスクライバでデータを検証する方法 (SQL Server Management Studio)
- レプリケーション Transact-SQL プログラミング : サブスクライバでデータを検証する方法 (レプリケーション Transact-SQL プログラミング)
- レプリケーション管理オブジェクト (RMO) プログラミング : サブスクライバでデータを検証する方法 (RMO プログラミング)
データ検証の結果
検証が完了すると、ディストリビューション エージェントまたはマージ エージェントは成功または失敗に関するメッセージをログに記録します (レプリケーションでは失敗した行については報告されません)。これらのメッセージは SQL Server Management Studio、レプリケーション モニタ、およびレプリケーション システム テーブルで参照できます。操作方法に関する上記のトピックは、検証の実行方法と結果を表示する方法を示しています。
データ検証の問題に対処するために、次の点を検討してください。
- 失敗が通知されるように、[レプリケーション: サブスクライバでデータ検証で問題が見つかりました] というレプリケーション警告を設定します。詳細については、「定義済みのレプリケーションの警告を構成する方法 (SQL Server Management Studio)」を参照してください。
- 検証の失敗はアプリケーションにとって問題となりますか? 検証の失敗が問題となる場合、データを手動で更新して同期するか、サブスクリプションを再初期化してください。
- データを更新するには tablediff ユーティリティを使用します。このユーティリティの使用方法の詳細については、「レプリケートされたテーブルを比較して相違があるかどうかを確認する方法 (レプリケーション プログラミング)」を参照してください。
- 再初期化の詳細については、「サブスクリプションの再初期化」を参照してください。
データ検証に関する注意点
データの検証に際しては、次の点に注意してください。
- データを検証する前にサブスクライバ側のすべての更新操作を停止する必要があります (検証実行時にパブリッシャ側の操作を停止する必要はありません)。
- チェックサムおよびバイナリ チェックサムを使用した検証を大規模なデータセットに対して行う場合には、大量のプロセッサ リソースが必要になるので、レプリケーションで使用するサーバーの利用状況が最小のときに検証を行うようにスケジュールする必要があります。
- レプリケーションはテーブルのみを検証します。スキーマのみのアーティクル (ストアド プロシージャなど) がパブリッシャとサブスクライバで同じであるかどうかは検証しません。
- バイナリ チェックサムは、パブリッシュされたどのテーブルでも使用できます。チェックサムは、列フィルタの設定されたテーブル、または列オフセットが異なる論理テーブル構造 (列を削除または追加する ALTER TABLE ステートメントの結果) は検証できません。
- text 列、ntext 列、または image 列のデータは、チェックサムの計算には含まれません。
- バイナリ チェックサムまたはチェックサムを使用した検証では、データ型がサブスクライバ側とパブリッシャ側とで異なる場合には、誤ってエラーを報告することがあります。このエラーは、サブスクリプションを手動で初期化してサブスクライバで異なるデータ型を使用している場合、またはアーティクルに対して次のスキーマ オプションを使用している場合に発生します。
- ユーザー定義データ型の、基本データ型へのマッピング (スキーマ オプション 0x20)
- xml の、ntext へのマッピング (スキーマ オプション 0x10000000)
- nvarchar(max) および varbinary(max) の、以前のバージョンの SQL Server でサポートされていたデータ型へのマッピング (スキーマ オプション 0x20000000)
スキーマ オプションの詳細については、「データとデータベース オブジェクトのパブリッシュ」を参照してください。
- バイナリ チェックサムおよびチェックサムによる検証は、トランザクション レプリケーションの変換可能なサブスクリプションではサポートされていません。
- 検証は、SQL Server 以外のサブスクライバにレプリケートされたデータに対してはサポートされていません。
データ検証の動作
SQL Server では、パブリッシャ側の行数やチェックサムを計算し、それらの値をサブスクライバ側で計算された行数やチェックサムと比較することで、データの検証を行います。一方の値はパブリケーション テーブル全体に対して計算され、もう一方の値はサブスクリプション テーブル全体に対して計算されます。ただし、text 列、ntext 列、または image 列にあるデータはその計算には含まれません。
計算が行われている間は、行数またはチェックサムの計算が行われているテーブルに共有ロックが一時的にかかりますが、計算はすぐに終了し、通常、数秒で共有ロックは解除されます。
バイナリ チェックサムを使用する場合は、32 ビット CRC (冗長性検査) がデータ ページの物理的な行ではなく、列ごとに実行されます。これにより、テーブルの列がデータ ページで物理的にどのような順序であっても、行については同じ CRC 値が計算されます。バイナリ チェックサムを使用した検証は、パブリケーション上に行フィルタまたは列フィルタがある場合に使用できます。SQL Server Version 7.0 を実行しているサブスクライバは、SQL Server Version 7.0 でリリースされたチェックサム アルゴリズムを使用する必要があります。このアルゴリズムでは、SQL Server 2000 以降で生成される CRC 値とは異なる CRC 値が生成されます。SQL Server Version 7.0 でリリースされたチェックサム ルーチンは、列フィルタの設定されたテーブル、または列オフセットが異なる論理テーブル構造 (列を削除または追加する ALTER TABLE ステートメントの結果) は検証できません。