Share via


CDC に関する既知の問題とエラー

適用対象: SQL ServerAzure SQL Managed Instance

この記事では、SQL ServerAzure SQL Managed Instance での変更データ キャプチャ (CDC) に関する既知の問題とエラーについて説明します。

Azure SQL Database については、「Azure SQL Database での CDC に関する既知の問題」を参照してください。

メタデータの変更

CDC が正常に機能するためには、手動で CDC schema、変更テーブル、CDC システム ストアド プロシージャ、既定の cdc user のアクセス許可 (sys.database_principals) などの CDC メタデータの変更または cdc user の名前の変更を行ってはいけません。

is_ms_shipped プロパティが 1 に設定されている sys.objects 内のオブジェクトは変更しないでください。

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

照合順序の違い

データベースの照合順序と、変更データ キャプチャ用に構成されたテーブルの列の照合順序が異なる状況について認識しておくことが重要です。 CDC は、中間記憶域を使用して、サイド テーブルを設定します。 テーブルにデータベースの照合順序とは異なる照合順序を持つ CHAR または VARCHAR 型の列があり、これらの列に非 ASCII 文字 (2 バイト DBCS 文字など) が格納される場合、CDC は変更されたデータとベース テーブル内のデータの整合性を維持できない可能性があります。 これは、中間記憶域の変数には照合順序を関連付けることができないためです。

キャプチャされた変更データとベース テーブルの整合性を保つには、次のいずれかの方法を検討してください。

  • 非 ASCII データを格納する列には NCHAR または NVARCHAR データ型を使用します。

  • または、列とデータベースに同じ照合順序を使用します。

たとえば、SQL_Latin1_General_CP1_CI_AS の照合順序を使用するデータベースがある場合について、次のようなテーブルを考えます。

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

列 C2 の照合順序が異なるので (Chinese_PRC_CI_AI)、この列に対するバイナリ データの CDC は失敗する可能性があります。 この問題を回避するには、NVARCHAR を使用します。

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

高速データベース復旧 (ADR) と Change Data Capure (CDC)

現時点では、変更データ キャプチャ (CDC) と高速データベース復旧 (ADR) の両方を有効にすることはサポートされていません。 SQL Server で変更データ キャプチャ (CDC) を有効にすると、ADR のログの積極的切り捨て機能は無効になります。 これは、CDC スキャンによりデータベース トランザクション ログにアクセスするためです。 アクティブなトランザクションは、トランザクションがコミットされ、CDC スキャンが追いつくか、トランザクションが中止されるまで、トランザクション ログの切り捨てを保留し続けます。 これにより、トランザクション ログが通常よりもいっぱいになったり、サイド テーブルに記録されたデータ操作が異常になるなど、さまざまな問題が発生する可能性があります。

CDC を有効にする場合は、[再開可能なインデックス] オプションを使用することをお勧めします。 再開可能なインデックスでインデックスを作成または再構築するために長期のトランザクションを開いたままにする必要はなく、この操作の間のログの切り捨てと、より優れたログ領域管理が可能です。 詳細については、「オンライン インデックス操作のガイドライン - 再開可能なインデックスに関する考慮事項」を参照してください 。

cdc という名前のスキーマまたはユーザーが既に存在する場合に、CDC の有効化が失敗する

データベースで CDC を有効にすると、cdc という名前の新しいスキーマおよびユーザーが作成されます。 そのため、システムでの使用のために予約されていることから、cdc という名前のカスタム スキーマまたはユーザーを手動で作成することはお勧めしません。

CDC に関連していない cdc という名前のカスタム スキーマまたはユーザーをデータベースで手動で定義した場合、システム ストアド プロシージャ sys.sp_cdc_enable_db では、以下のエラー メッセージによってデータベースで CDC の有効化に失敗します。

データベース <database_name> を変更データ キャプチャに対して有効にすることができません。'cdc' という名前のデータベース ユーザーまたは 'cdc' という名前のスキーマが現在のデータベースに既に存在します。 これらのオブジェクトは、CDC のみによって必要とされます。 ユーザーまたはスキーマを削除するか名前を変更してから、操作を再試行してください。

この問題を解決するには、次の手順を実行します。

  • 空の cdc スキーマと cdc ユーザーを手動で削除します。 その後、データベースで CDC を正常に有効にすることができます。

ALTER COLUMN から VARCHAR および VARBINARY への後に CDC が失敗する

CDC 対応テーブルの列のデータ型が TEXT から VARCHAR または IMAGE から VARBINARY で変更され、既存の行が行外の値に更新された場合。 更新後、CDC スキャンによってエラーが発生します。

ソース テーブルに対する DDL 変更

DDL ステートメントを使用して CDC 対応テーブルの列のサイズを変更すると、後続の CDC キャプチャ プロセスで 問題が発生し、エラー 2628 または エラー 8115 が発生する可能性があります。 CDC 変更テーブルのデータは、ユーザーが構成した設定に基づいて保持されます。 そのため、列サイズを変更する前に、変更が CDC 変更テーブルの既存のデータと互換性があるかどうかを評価する必要があります。

変更テーブルのsys.dm_cdc_errorsエラー 2628 またはエラー 8115 が原因でスキャンが失敗していることを示す場合は、まず、影響を受ける変更テーブルの変更データを使用する必要があります。 その後、問題を効果的に解決するには 、テーブルで CDC を無効にしてから再度有効にする必要があります。

データ層のインポート/エクスポートおよび抽出/発行操作を使用してデータベースをインポートする

CDC が有効な SQL データベースの場合、SqlPackage、SSDT、またはその他の SQL ツールを使用してインポート、エクスポート、抽出、発行を行う場合、 cdc スキーマとユーザーは新しいデータベースで除外されます。 インポート/エクスポートおよび抽出/配置操作に含まれないその他の CDC オブジェクトには、sys.objects でマークされた is_ms_shipped=1 テーブルが含まれます。

CDC が有効でなく、データベースに名前付きの cdc カスタム スキーマまたはユーザーを定義した場合でも、新しいデータベースをインポート/セットアップするためのインポート/エクスポートおよび抽出/配置操作でも除外されます。

変数を使用したパーティションの切り替え

変更データ キャプチャ (CDC) が有効なデータベースまたはテーブルでのパーティション切り替えに変数を使用することは、ALTER TABLE ... SWITCH TO ... PARTITION ... ステートメントではサポートされていません。 詳細については、パーティション切り替えの制限事項に関するセクションを参照してください。

トラブルシューティング エラー

このセクションでは、SQL Server 上の CDC と Azure SQL Managed Instance に関連したエラーのトラブルシューティングに進みます。 CDC 関連のエラーは、キャプチャ プロセスの適切な機能を妨げ、データベース トランザクション ログの拡張につながる可能性があります。

これらのエラーを調べるには、動的管理ビュー のsys.dm_cdc_errors クエリを実行します。 sys.dm_cdc_errors 動的管理ビューでエラーが返される場合は、次のセクションを参照して軽減策の手順を把握してください。

Note

特定のエラー コードの詳細については、「データベース エンジンのイベントとエラー」を参照してください。

このセクションに含まれるさまざまなトラブルシューティング カテゴリを次に示します。

カテゴリ 説明
変更されたメタデータ 追跡対象のテーブルが変更または削除されたときに CDC に関連した問題を軽減する方法についての情報が含まれています。
データベース領域の管理 データベース領域が使い果たされた際の問題を軽減する方法についての情報が含まれています。
CDC の制限事項 CDC の制限に起因する問題を軽減する方法についての情報が含まれています。

変更されたメタデータ

エラー 200/208 - 無効なオブジェクト名

  • 原因: CDC メタデータが削除されたときに、このエラーが発生する可能性があります。 CDC が正常に機能するためには、手動で CDC schema、変更テーブル、CDC システム ストアド プロシージャ、既定の cdc user のアクセス許可 (sys.database_principals) などの CDC メタデータの変更または cdc user の名前の変更を行ってはいけません。

  • 推奨事項: この問題に対処するには、データベースの CDC を無効にして、再度有効にする必要があります。 データベースで変更データ キャプチャを有効にすると、cdc スキーマ、cdc ユーザー、メタデータ テーブル、その他のシステム オブジェクトがデータベースに作成されます。

Note

is_ms_shipped=1 and schema_name='cdc' を持つ sys.objects システム カタログ ビューで見つかったオブジェクトは、変更または削除しないでください。

エラー 1202 - データベース プリンシパルが存在しないか、ユーザーがメンバーではありません

  • 原因: CDC ユーザーが削除されたときに、このエラーが発生する可能性があります。 CDC が正常に機能するためには、手動で CDC schema、変更テーブル、CDC システム ストアド プロシージャ、既定の cdc user のアクセス許可 (sys.database_principals) などの CDC メタデータの変更または cdc user の名前の変更を行ってはいけません。

  • 推奨事項: cdc ユーザーがデータベースに存在し、なおかつ db_owner ロールに割り当てられていることを確認します。 cdc ユーザーを作成するには、「cdc ユーザーの作成とロールの割り当て」の例を参照してください。

エラー 15517 - プリンシパルが存在しないため、データベース プリンシパルとして実行できません

  • 原因: この種類のプリンシパルを偽装できないか、アクセス許可がありません。 このエラーは、CDC メタデータが削除された場合、または db_owner ロールの一部ではなくなった場合に発生する可能性があります。 CDC が正常に機能するためには、手動で CDC schema、変更テーブル、CDC システム ストアド プロシージャ、既定の cdc user のアクセス許可 (sys.database_principals) などの CDC メタデータの変更または cdc user の名前の変更を行ってはいけません。

  • 推奨事項: cdc ユーザーがデータベースに存在し、なおかつ db_owner ロールに割り当てられていることを確認します。 cdc ユーザーを作成するには、「cdc ユーザーの作成とロールの割り当て」の例を参照してください。

エラー 18807 - レプリケーション システム テーブルのオブジェクト ID が見つかりません

  • 原因: このエラーは、SQL Server でレプリケーション システム テーブル '%s' が見からないか、それにアクセスできない場合に発生します。 これは、このテーブルが見つからないか、到達できないことが原因となっている可能性があります。 CDC が正常に機能するためには、手動で CDC schema、変更テーブル、CDC システム ストアド プロシージャ、既定の cdc user のアクセス許可 (sys.database_principals) などの CDC メタデータの変更または cdc user の名前の変更を行ってはいけません。

  • 推奨事項: テーブルに対して直接クエリを実行し、システム テーブルが存在していて、アクセスできることを確認してください。 sys.objects システム カタログにクエリを実行し、述語句を is_ms_shipped=1 and schema_name='cdc' に設定し、CDC 関連のすべてのオブジェクトを一覧表示します。 クエリでオブジェクトが返されない場合は、データベースの CDC を無効にしてから再度有効にする必要があります。 データベースで変更データ キャプチャを有効にすると、cdc スキーマ、cdc ユーザー、メタデータ テーブル、その他のシステム オブジェクトがデータベースに作成されます。

エラー 21050 - この操作を実行できるのは、sysadmin または db_owner 固定サーバー ロールのメンバーだけです

  • 原因: cdc ユーザーが db_owner データベース ロールから、または sysadmin サーバー ロールから削除されました。

  • 推奨事項: cdc ユーザーに db_owner ロールが割り当てられていることを確認します。 cdc ユーザーを作成するには、「cdc ユーザーの作成とロールの割り当て」の例を参照してください。

データベース領域の管理

エラー 1105 - ファイル グループが満杯のため、データベースにオブジェクトの領域を割り当てられませんでした

  • 原因: このエラーは、データベースのプライマリ ファイル グループで領域が不足し、SQL Server でそのファイル グループ内のオブジェクト (テーブルやインデックスなど) により多くの領域を割り当てることができない場合に発生します。

  • 推奨事項: この問題を解決するには、データベース内の不要なデータを削除して、領域を解放してください。 安全に削除できるファイル グループ内の未使用のテーブル、インデックス、その他のオブジェクトを識別します。 領域使用率を注意深く監視し、詳細については「Azure SQL Database でデータベースのファイル領域を管理する」を参照してください。

    不要なデータ/オブジェクトの削除を選択できない場合は、データベース トランザクション ログにより多くの領域を割り当てることを検討してください。 トランザクション ログの管理に関する詳細については、「SQL Server トランザクション ログのアーキテクチャと管理ガイド」を参照してください。

CDC の制限

エラー 2628 - テーブル内の文字列またはバイナリ データが切り捨てられます

  • 原因: DDL ステートメントを使用して CDC 対応テーブルの列のサイズを変更すると、後続の CDC キャプチャ プロセスで問題が発生する可能性があります。 'sys.dm_cdc_errors' 動的管理ビュー (DMV) は、エラー番号 2628 および 8115 など、報告された問題に対して CDC をチェックするために役立ちます。

  • 推奨事項: 列サイズを変更する前に、変更に CDC 変更テーブルの既存のデータと互換性があるかどうかを評価する必要があります。 この問題に対処するには、データベースの CDC を無効にして再度有効にする必要があります。 データベースまたはテーブルに対して CDC を有効にする方法の詳細については、「CDC をデータベースに対して有効にする」および「CDC をテーブルに対して有効にする」を参照してください。

エラー 913 - システム CLR データ型のテーブルの変更を処理する際に CDC キャプチャ ジョブが失敗します

  • 原因: このエラーは、システム CLR データ型のテーブルで CDC を有効にして、DML を変更した後、CDC キャプチャ ジョブで他のテーブルに関連した変更を処理している間に同じテーブルで DDL の変更が行われる場合に発生します。

  • 推奨事項: 推奨される手順は、テーブルに対する DML を休止し、変更を処理するキャプチャ ジョブを実行して、テーブルの DDL を実行し、DDL の変更を処理するキャプチャ ジョブを実行してから、DML の処理を再度有効にすることです。 詳細については、「変更を処理するときに CDC キャプチャ ジョブが失敗する」を参照してください。

ユーザーを作成してロールを割り当てる

cdc user が削除された場合は、ユーザーを手動で追加し直すことができます。

次の T-SQL スクリプトを使用して、ユーザー (cdc) を作成し、同じユーザー (db_owner) に適切なロールを割り当てます。

IF NOT EXISTS 
(
    SELECT * 
    FROM sys.database_principals 
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] 
    WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

ロール メンバーシップを確認して追加する

cdc ユーザーが sysadmin または db_owner のいずれかのロールに属しているかどうかを確認するには、次の T-SQL クエリを実行します。

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

cdc ユーザーがどちらのロールにも属していない場合は、次の T-SQL クエリを実行して、cdc ユーザーに ロールを追加db_ownerします。

EXEC sp_addrolemember 'db_owner' , 'cdc';

次のステップ