KB2733630 - SQL Server でのマージ レプリケーション同期中にマージ エージェントが失敗する場合がある

適用先
SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Express SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Express SQL Server 2008 R2 Parallel Data Warehouse SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2008 Standard SQL Server 2008 Web SQL Server 2008 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Express SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Express - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Web - duplicate (do not use)

現象

Microsoft SQL Server 2008 以降のバージョンの SQL Server でのマージ レプリケーションの同期中に、マージ エージェントが失敗することがあります。 さらに、以下のエラー メッセージが表示されます。

注

マージ エージェントは、保持ベースのメタデータ クリーンアップによって、まだ発行元に送信されていない変更のサブスクライバーのメタデータが削除されたことを検出した後に失敗しました。 サブスクリプションを再初期化する必要があります (アップロードなし)。 (ソース: MSSQL_REPL、エラー番号: MSSQL_REPL-2147199401)

ヘルプの表示: http://help/MSSQL_REPL-2147199401

この問題は複数の理由で発生する可能性があります。 これらには、特定の状況下で予想される多くの理由が含まれます。 このエラーが予期せず発生したかどうかを判断するには、「原因」セクションに記載されているメタデータの詳細を確認してください。

原因

この問題の原因は、サブスクライバーの次のシステム テーブルで確認できます。

  • dbo.sysMergeSubscriptions
  • dbo.MsMerge_Genhistory

マージ エージェントが同期されなくなったことを確認します。 次に、次のクエリを実行し、結果を確認します。

select sentgen from SubscriberDB.dbo.sysMergeSubscriptions where pubid = subid and sentgen is not null

クエリ結果

sentgen 列は、サブスクライバーが発行元に送信した変更の最も古いグループを示します。 複数の値が返された場合は、dbo.sysMergeSubscriptions テーブルの他の列を調べて、正しいパブリケーションのメタデータが表示されていることを確認します。 次に、このクエリが返す値を次のクエリで使用します。

SELECT top 20 * FROM SubscriberDB.dbo.MSmerge_genhistory where generation >= sentgen_value order by generationクエリの出力は次のようになります。

世代別のクエリ結果

次のすべての条件に該当する場合、予期しないエラーが発生する場合があります。

  • 1 行目の generation 列の値は、前のクエリの sentgen 値よりわずかに大きくなります。
  • genstatus 列の値は 4 です。
  • changecount 列の値は 0 です。

注: また、1 行目の列の値は、通常、他の行の 列 の値よりもはるかに古いものです。

解決策

この問題を解決するには、エラーを生成したサブスクライバーを再初期化します。

一部のシナリオでは、完全な再初期化なしでこの問題を解決できる場合があります。 考えられる回避策については、Microsoft Customer Support Services にお問い合わせください。

この問題が今後再発しないようにするには、SQL Server のバージョンに応じて、次のいずれかの修正プログラムを適用してください。

累積的な更新プログラムの情報

SQL Server 2008

SQL Server 2008 には、この問題の修正プログラムはありません。

SQL Server 2008 R2 Service Pack 2

この問題の修正プログラムは、累積的な更新プログラム 3 で最初にリリースされました。 SQL Server 2008 R2 Service Pack 2 用のこの累積的な更新プログラム パッケージを入手する方法の詳細については、以下のサポート技術情報番号をクリックしてください。

2754552 SQL Server 2008 R2 Service Pack 2 の累積的な更新プログラム パッケージ 3
 注: ビルドは累積的であるため、新しい修正プログラムの各リリースには、以前の SQL Server 2008 R2 Service Pack 2 修正プログラムのリリースに含まれていたすべての修正プログラムとセキュリティ更新プログラムが含まれています。 この修正プログラムが含まれている最新リリースの修正の適用を検討することを推奨します。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

2730301 SQL Server 2008 R2 Service Pack 2 以降にリリースされた SQL Server 2008 R2 ビルド

SQL Server 2012

この問題の修正プログラムは、累積的な更新プログラム 4 で最初にリリースされました。 SQL Server 2012 用のこの累積的な更新プログラム パッケージを入手する方法の詳細については、以下のサポート技術情報番号をクリックしてください。

2758687 SQL Server 2012 用の累積的な更新プログラム パッケージ 4
 注: ビルドは累積的であるため、新しい修正プログラムのリリースには、以前の SQL Server 2012 更新プログラムのリリースに含まれていたすべての修正プログラムとセキュリティ更新プログラムが含まれています。 この修正プログラムが含まれている最新リリースの修正の適用を検討することを推奨します。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

2692828 SQL Server 2012 以降にリリースされた SQL Server 2012 ビルド

SQL Server 2008 R2 Service Pack 1

この問題の修正プログラムは、累積的な更新プログラム 8 で最初にリリースされました。 SQL Server 2008 R2 Service Pack 1 用のこの累積的な更新プログラム パッケージを入手する方法の詳細については、以下のサポート技術情報番号をクリックしてください。

2723743 SQL Server 2008 R2 SP1 の累積的な更新プログラム パッケージ 8 注: ビルドは累積的であるため、新しくリリースされた修正プログラムには、以前の SQL Server 2008 R2 Service Pack 1 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 この修正プログラムが含まれている最新リリースの修正の適用を検討することを推奨します。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

2567616 2008 R2 SP1 以降にリリースされた SQL Server 2008 R2 ビルドSQL Server