次の方法で共有


システム CLR データ型 (geometry、geography、または hierarchyid) を持つテーブルの変更を処理するときに CDC キャプチャ ジョブが失敗する

この記事は、システム CLR データ型 (geometry、geography、または hierarchyid) を持つテーブルの変更を処理するときに CDC キャプチャ ジョブが失敗する問題を回避するのに役立ちます。

適用対象: SQL Server
元の KB 番号: 4538384

現象

以下のシナリオについて考えてみます。

  • ジオメトリ、geography、hierarchyid などのシステム CLR データ型を持つテーブルで、変更データ キャプチャ (CDC) 機能を有効にします。
  • CDC キャプチャ (スキャン) ジョブは、他のテーブルに関連する変更を処理しています。 プロセスが、システム CLR データ型を持つテーブルにまだ到達していません。
  • システム CLR データ型を持つテーブルに対して、データ操作言語 (DML) を変更します。 次に、同じテーブルでデータ定義言語 (DDL) を変更します (たとえば、列を追加します)。

このシナリオでは、CDC キャプチャ ジョブがシステム CLR データ型を持つテーブルの処理を開始すると、失敗し、次のエラー メッセージが返されます。

メッセージ 18805、レベル 16、状態 1、プロシージャ sp_replcmds、LineLineNumber[バッチ開始行 LineNumber]
ログ スキャン プロセスで、ログ シーケンス番号 (LSN) {nnnnnnnn: nnnnnnnn: nnnn} からレプリケートされたコマンドを作成できませんでした。 パブリケーション データベースをバックアップし、ご購入元に問い合わせてください。
メッセージ 22859、レベル 16、状態 2、プロシージャ sp_replcmds、行番号 [バッチ開始行の LineNumber]
ログ レコードの処理中にログ スキャン プロセスが失敗しました。 現在のセッションで発生した以前のエラーを参照して原因を特定し、関連している問題をすべて修正してください。
メッセージ 3621、レベル 16、状態 6、プロシージャ sp_replcmds、行番号 [バッチ開始行の LineNumber]
ステートメントは終了されました。
メッセージ 22864、レベル 16、状態 1、プロシージャ sp_MScdc_capture_job、LineNumber[バッチ開始行 LineNumber]
データベース 'DatabaseName' のキャプチャ ジョブによるsp_MScdc_capture_jobの呼び出しに失敗しました。 以前のエラーを参照してエラーの原因を特定してください。

さらに、次のエントリがエラー ログに記録される場合があります。

エラー: 913、重大度: 16、状態: 16。 データベース IDID が見つかりませんでした。 データベースがまだ有効になっていないか、状態遷移中である可能性があります。 データベースが使用可能になってから、クエリを再発行してください。 このエラーが原因でデータベースの状態が遷移していると思わない場合、このエラーは引き続き発生します。

詳細

この問題は、CDC キャプチャ ジョブが最初に DML のみを処理し、次の実行時に DDL の変更を処理する場合には発生しません。

回避策

この問題を回避するには、次のいずれかの方法を試してください。

  • 問題のあるデータ型 (geometry、geography、hierarchyid) を CDC と共に使用しないでください。

  • ジオメトリ、geography、または hierarchyid データ型を持つテーブルで DDL 変更を行うときに、インフライト DML の変更がないことを確認します。 この問題を回避するには、次の手順に従います。

    1. すべての DML をテーブルに休止します。
    2. 変更を処理するキャプチャ ジョブを実行します。
    3. テーブルの DDL を実行します。
    4. キャプチャ ジョブを実行して DDL の変更を処理します。
    5. DML 処理を再度有効にします。

    Note

    この問題が引き続き発生する場合は、テーブルで CDC を無効にしてから再度有効にします。