レプリケーション ジョブのトラブルシューティング

このページでは、Cloud Data Fusion レプリケーション ジョブに関連する問題を解決する方法について説明します。

例外: ステージング バケットを作成できない

バケットの命名規則に違反した場合、レプリケーション ジョブに失敗し、パイプライン ログに次のエラーが発生することがあります。

Caused by: java.io.IOException: Unable to create staging bucket
BUCKET_NAME in project PROJECT_NAME.

必要に応じて、ステージング バケット名を指定できます。指定されていない場合、レプリケーション ジョブがジョブ名に接尾辞を追加することで生成します。場合によっては、短いジョブ名を使用してこの問題を解決できます。 詳細については、バケット名をご覧ください。

MySQL の CONVERT_TO_NULL 値が設定されていない

以前のバージョンの MySQL Connector/J (バージョン 5 など)を使用している場合、レプリケーション ジョブは次のエラーで失敗します。

The connection property 'zeroDateTimeBehavior' only accepts values of the form:
'exception', 'round' or 'convertToNull'. The value 'CONVERT_TO_NULL' is not in
this set.

zeroDateTimeBehavior に指定できる値は、MySQL Connector/J のバージョン間で互換性がありません。

この問題を解決するには、MySQL Connector/J バージョン 8 以降を使用します。

レプリケーションと SQL Server Always On データベース

Microsoft SQL Server ソースは、Always On 読み取り専用レプリカから変更をキャプチャできます。この設定では、ランタイム引数 source.connector.database.applicationIntent=ReadOnly をレプリケーション ジョブに渡す必要があります。このランタイム引数がないと、ジョブは次のエラーで失敗します。

Producer failure
java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException:
Failed to update database "DATABASE_NAME" because the database is read-only.

この問題を解決するには、source.connector.database.applicationIntent=ReadOnlyランタイム引数として設定します。 これにより、snapshot.isolation.mode が内部で snapshot に設定されます。

Dataproc 静的クラスタのレプリケーション エラー

レプリケーション ジョブを実行すると、Dataproc クラスタノードからの SSL 接続に失敗し、java.lang.NullPointerException または Connection reset エラーが発生することがあります。

ERROR [SparkRunnerphase-1:i.c.c.i.a.r.ProgramControllerServiceAdapter@93] -
Spark program 'phase-1' failed with error: The driver could not establish a
secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption.
Error: "Connection reset ClientConnectionId:ID"

このエラーは、Dataproc にインストールされている JDK バージョンで使用するように構成された Conscrypt SSL プロバイダが原因で発生します。

この問題を解決するには、Conscrypt SSL プロバイダを無効にして Java JDK のデフォルトの SSL プロバイダを使用します。Conscrypt SSL プロバイダを無効にするには、Dataproc クラスタを起動するときに次のクラスタ プロパティを設定します。

--properties dataproc:dataproc.conscrypt.provider.enable=false

SQL Server のレプリケーションに、変更されたテーブルのすべての列が複製されない

SQL Server のテーブルからデータを複製する際に、レプリケーション ソースのテーブルに新しく追加された列がある場合、変更データ キャプチャ(CDC)テーブルに自動的に追加されません。基になる CDC テーブルに手動で列を追加する必要があります。

この問題を解決する方法は次のとおりです。

  1. CDC インスタンスを無効にします。

    EXEC sp_cdc_disable_table
    @source_schema = N'dbo',
    @source_name = N'myTable',
    @capture_instance = 'dbo_myTable'
    GO
    
  2. CDC インスタンスをもう一度有効にします。

    EXEC sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name = N'myTable',
    @role_name = NULL,
    @capture_instance = 'dbo_myTable'
    GO
    
  3. 新しいレプリケーション ジョブを作成します。

詳細については、ソーステーブルへの変更の処理をご覧ください。

ロールと権限のエラー

アクセス制御では次の問題が発生します。

Cloud Data Fusion サービス アカウントの権限に関する問題

Oracle Database を使用してレプリケーション ジョブを実行すると、テーブルリストの取得に失敗し、次のエラーが発生することがあります。

Error io.grpc.StatusRuntimeException: PERMISSION_DENIED: Permission
'datastream.streams.get' denied on 'projects/PROJECT_NAME/locations/REGION/streams/STREAM_NAME'

Oracle データベースでレプリケーション ジョブを実行すると、Cloud Data Fusion はバックエンドの Datastream サービスを使用します。 Datastream サービスを使用するために必要な権限を取得するには、Cloud Data Fusion サービス アカウントに対する Datastream 管理者roles/datastream.admin)IAM ロールの付与を管理者に依頼してください。

変更データ キャプチャを表示する権限がない

SQL Server からデータを複製すると、パイプライン ログに次のエラーが表示されることがあります。

No whitelisted table has enabled CDC, whitelisted table list does not contain any
table with CDC enabled or no table match the white/blacklist filter(s)

この問題は、ソース接続プロパティに指定したユーザーが、レプリケートされたテーブルの変更データ キャプチャ(CDC)を表示する権限を持っていない場合に発生します。これは、sys.sp_cdc_enable_table を使用してテーブルで CDC を有効にするときに role_name パラメータによって制御されます。

CDC を表示するために必要な権限を付与する方法については、テーブルで CDC を有効にするsys.sp_cdc_enable_table をご覧ください。

ユーザー定義型権限の問題

レプリケーション ジョブで使用されるデータベース ユーザーにユーザー定義型(UDT)に対する権限がない場合、パイプライン ログに次のエラーが表示されることがあります。

java.lang.IllegalArgumentException: The primary key cannot reference a non-existent
column'oid' in table TABLE_NAME

このエラー メッセージでは、oid 列が UDT になっている可能性があります。

この問題を解決するには、データベースで次のコマンドを実行してユーザーにアクセス権を付与します。

GRANT EXECUTE ON TYPE::UDT_NAME to YOUR_USER

SQL Server エージェントが実行されていない

SQL Server エージェントが実行されていない場合、パイプライン ログに次のエラーが表示されることがあります。

No maximum LSN recorded in the database; please ensure that the SQL Server Agent
is running [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]

この問題を解決するには、SQL Server エージェントを起動します。詳細については、ご使用のオペレーティング システムに応じて次のドキュメントを参照してください。

SQL Server レプリケーション パイプラインのバージョンが最新ではない

SQL Server レプリケーション パイプラインのバージョンが最新でない場合は、パイプライン ログに次のエラーが表示されます。

Method io/cdap/delta/sqlserver/SqlServerDeltaSource.configure(Lio/cdap/delta/api/SourceConfigurer;) is abstract

このようなエラーは、以前のバージョンのソース プラグインが比較的新しいバージョンのデルタアプリで使われている場合に発生します。このような場合、新しいバージョンのデルタアプリで定義された新しいインターフェースが実装されていません。

この問題を解決する方法は次のとおりです。

  1. HTTP GET リクエストを送信して、レプリケーション ジョブに関する情報を取得します。

    GET v3/namespaces/NAMESPACE_ID/apps/REPLICATOR_NAME
    

    詳細については、レプリケーション ジョブの詳細を表示するをご覧ください。

  2. レプリケーション ジョブで使用されているプラグインとデルタ アプリのバージョンを確認します。

  3. HTTP GET リクエストを送信して、使用可能なアーティファクトのリストを取得します。

    GET /v3/namespaces/NAMESPACE_ID/artifacts
    

    詳細については、利用可能なアーティファクトの一覧表示をご覧ください。

認証スコープが不十分な静的 Dataproc クラスタ

認証スコープが不十分な静的 Dataproc クラスタを使用している場合は、パイプライン ログに次のエラーが表示されることがあります。

ERROR [worker-DeltaWorker-0:i.c.c.i.a.r.ProgramControllerServiceAdapter@92] - Worker
Program 'DeltaWorker' failed.
Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had
insufficient authentication scopes.

この問題を解決するには、新しい静的 Dataproc クラスタを作成し、同じプロジェクトでこのクラスタの cloud-platform スコープを有効にします。