SQL Server インジェストのトラブルシューティング
このページでは、Databricks Lakeflow Connect の Microsoft SQL Server コネクタに関する一般的な問題とその解決方法について説明します。
すべてのマネージド インジェスト パイプラインに適用される一般的なトラブルシューティング ガイダンスについては、マネージド インジェスト パイプラインのトラブルシューティングを参照してください。
CDC がデータベースまたはテーブルで有効になっているかどうかを確認する
CDC がデータベース <database-name>に対して有効になっているかどうかを確認するには:
select is_cdc_enabled from sys.databases where name='<database-name>';
CDC がテーブル <schema-name>.<table-name>で有効になっているかどうかを確認するには:
select t.is_tracked_by_cdc
from sys.tables t join sys.schemas s on t.schema_id = s.schema_id
where s.name='<schema-name>' and t.name='<table-name>';
変更追跡がデータベースまたはテーブルに対して有効になっているかどうかを確認する
データベース\<database-name\>の変更追跡が有効になっているかどうかを確認するには:
select ctdb.*
from sys.change_tracking_databases ctdb join sys.databases db
on db.database_id = ctdb.database_id
where db.name = '<MyDatabaseName>'
テーブル <schema-name>.<table-name>の変更追跡が有効になっているかどうかを確認するには:
select s.name schema_name, t.name table_name, ct.*
from sys.change_tracking_tables ct join sys.tables t
on ct.object_id = t.object_id
join sys.schemas s on t.schema_id = s.schema_id
where s.name = '<MySchemaName>' and t.name = '<MyTableName>'
テーブルトークンの待機中にタイムアウト
インジェスト パイプラインは、ゲートウェイから情報が提供されるのを待っている間にタイムアウトする場合があります。これは、次の理由が考えられます。
- 古いバージョンのゲートウェイを実行しています。
- 必要な情報の生成中にエラーが発生しました。ゲートウェイ ドライバーのログでエラーを確認します。
完全更新フローにより、完全更新操作中のタイムアウト エラーの発生が大幅に削減されます。 「完全更新動作 (CDC)」を参照してください。
デフォルトの認証: デフォルトの認証情報を設定できません
このエラーが表示された場合は、現在のユーザー資格情報の検出に問題があります。次のものを置き換えてみてください。
w = WorkspaceClient()
で:
w = WorkspaceClient(host=input('Databricks Workspace URL: '), token=input('Token: '))
Databricks SDK for Python ドキュメントの 認証 を参照してください。
tech.replicant.common.ExtractorException:com.microsoft.sqlserver.JDBC.SQLServerException:無効な列名「SERIAL_NUMBER」。
このエラーは、古いバージョンの内部テーブルを使用している場合に表示されることがあります。接続されたデータベースで次のコマンドを実行します。
drop table dbo.replicate_io_audit_ddl_trigger_1;
PERMISSION_DENIED: You are not authorized to create clusters. Please contact your administrator.
Databricks アカウント管理者に連絡して、 Unrestricted cluster creation アクセス許可を付与してください。
DLT ERROR CODE: INGESTION_GATEWAY_INTERNAL_ERROR
ドライバー ログの stdout ファイルを確認します。
ソース テーブルの名前の競合
Ingestion pipeline error: "org.apache.spark.sql.catalyst.ExtendedAnalysisException: Cannot have multiple queries named `XYZ_snapshot_load` for `XYZ`. Additional queries on that table must be named. Note that unnamed queries default to the same name as the table.
これは、同じインジェスト パイプラインによって同じ宛先スキーマに取り込まれている、異なるソース スキーマ内の XYZ という名前の複数のソース テーブルが原因で名前の競合が発生していることを示しています。
複数のゲートウェイとパイプラインのペアを作成し、これらの競合するテーブルを異なる送信先スキーマに書き込みます。
Incompatible schema changes
互換性のないスキーマの変更により、インジェスト パイプラインは INCOMPATIBLE_SCHEMA_CHANGE エラーで失敗します。レプリケーションを続行するには、影響を受けるテーブルの完全更新をトリガーします。
Databricks では、互換性のないスキーマ変更のためにインジェスト パイプラインが失敗した時点で、スキーマ変更前のすべての行が取り込まれていることを保証できません。
NON_INCREMENTAL_SCHEMA_CHANGE
NON_INCREMENTAL_SCHEMA_CHANGE: Column '<column>' was added to table '<table>'. A full refresh is required to continue incremental ingestion.
このエラーは、増分取り込みがアクティブなときに、ソーステーブルに新しい列が追加されると発生します。コネクタは、履歴変更データから新しい列の値をバックフィルできないため、完全な更新が必要です。
取り込みを再開するには、影響を受けるテーブルの完全な更新を実行します。ターゲットテーブルを完全に更新を参照してください。
MISSING_TABLE_IN_SOURCE
MISSING_TABLE_IN_SOURCE: Table '<schema>.<table>' could not be found in the source database.
このエラーは、ソースデータベースで以前利用可能だったテーブルが見つからなくなったときに発生します。一般的な原因は次のとおりです:
- テーブルの名前が変更されたか、ソースで削除されました。
- テーブルは一時的に利用できません。たとえば、メンテナンス期間中などです。
解決するには:
- テーブルが一時的に利用できない場合は、メンテナンスが完了するまで待ってから、パイプラインを再試行してください。
- テーブルの名前が変更されたか、再作成された場合は、影響を受けるテーブルの完全なランを更新してください。
- テーブルが意図的にドロップされた場合、パイプラインから削除してください。
Azure Storageへのアクセス時のHTTP 403エラー
パイプラインが INTERNAL_ERROR: Server returned HTTP response code: 403 for URL のようなエラーで失敗する場合、コンピュートがSQL Serverコネクタで使用されるAzureストレージEndpointにアクセスできない可能性があります。
問題を特定するために、Databricks ノートブックで以下のテストをランします。共有アクセス署名 (SAS) トークンをハードコーディングするのではなく、dbutils.secrets を使用して取得してください。
DFS Endpoint (ADLS Gen2) へのアクセスをテストする
以下のスニペットは、Distributed File System (DFS) Endpoint とも呼ばれる Azure Data Lake Storage (ADLS) Gen2 Endpoint に対して、リスト表示、読み取り、書き込みを行います。プレースホルダーの値をストレージアカウント、コンテナ、シークレットの詳細に置き換え、それをランして SAS トークンが DFS Endpoint に到達できるかを確認します:
storage_account = "<storage-account>"
container = "<container>"
sas_token = dbutils.secrets.get(scope="<scope>", key="<key>")
spark.conf.set(
f"fs.azure.sas.{container}.{storage_account}.dfs.core.windows.net",
sas_token
)
base_path = f"abfss://{container}@{storage_account}.dfs.core.windows.net/"
# List contents
display(dbutils.fs.ls(base_path))
# Read a file
df = spark.read.format("parquet").load(base_path + "<path-to-file>")
display(df.limit(10))
# Write a test file
df.write.format("delta").save(base_path + "_connectivity_test")
Blob Endpoint へのアクセスをテストする
DFSテストは成功してもパイプラインが失敗する場合は、コネクタが代わりにBlob Endpointを使用している可能性があります。次のスニペットは、Blob Endpointに対して同じリスト、読み取り、および書き込みチェックをランを実行します。
storage_account = "<storage-account>"
container = "<container>"
sas_token = dbutils.secrets.get(scope="<scope>", key="<key>")
spark.conf.set(
f"fs.azure.sas.{container}.{storage_account}.blob.core.windows.net",
sas_token
)
base_path = f"wasbs://{container}@{storage_account}.blob.core.windows.net/"
# List files
display(dbutils.fs.ls(base_path))
# Read a file
df = spark.read.format("parquet").load(base_path + "<path-to-file>")
display(df.limit(10))
# Write a test file
df.write.format("delta").save(base_path + "_connectivity_test")
いずれかのテストで403エラーが返される場合、SASトークンに必要な権限が不足しているか、正しいEndpointをカバーしていません。SASトークンがコンテナーに対する少なくとも Read (読み取り)および List (一覧表示)権限を付与していることを確認し、必要に応じて再生成してください。
TLSサーバー証明書のエラー
TLSサーバー証明書の検証エラーのトラブルシューティングについては、 「TLS証明書エラーのトラブルシューティング」を参照してください。