システム 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 の変更がないことを確認します。 この問題を回避するには、次の手順に従います。
- すべての DML をテーブルに休止します。
- 変更を処理するキャプチャ ジョブを実行します。
- テーブルの DDL を実行します。
- キャプチャ ジョブを実行して DDL の変更を処理します。
- DML 処理を再度有効にします。
Note
この問題が引き続き発生する場合は、テーブルで CDC を無効にしてから再度有効にします。