排解複製工作問題

本頁說明如何解決 Cloud Data Fusion 複寫工作相關問題。

例外狀況:無法建立暫存值區

如果違反 bucket 命名慣例,複製作業可能會失敗,管道記錄中會顯示下列錯誤:

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

您可以選擇提供暫存值區名稱。如果未提供,複寫工作會為工作名稱加上後置字串,藉此產生工作 ID。在某些情況下,使用較短的職稱即可解決這個問題。 詳情請參閱「值區名稱」。

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.

不同版本的 MySQL Connector/J 接受的 zeroDateTimeBehavior 值不相容。

如要解決這個問題,請使用 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

Managed Service for Apache Spark 靜態叢集發生複寫錯誤

執行複製作業時,Managed Service for Apache Spark 叢集節點的 SSL 連線可能會失敗,並顯示 java.lang.NullPointerExceptionConnection 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"

發生這項錯誤的原因是,為 Managed Service for Apache Spark 安裝的 JDK 版本設定了要使用的 Conscrypt SSL 提供者

如要解決這個問題,請停用 Conscrypt SSL 提供者,改用 Java JDK 的預設 SSL 提供者。如要停用 Conscrypt SSL 提供者,請在啟動 Managed Service for Apache Spark 叢集時,設定下列叢集屬性

--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 資料庫執行複製工作時,擷取資料表清單可能會失敗,並顯示下列錯誤訊息:

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. 檢查複製作業使用的外掛程式和 Delta 應用程式版本。

  3. 提交 HTTP GET 要求,擷取可用構件的清單:

    GET /v3/namespaces/NAMESPACE_ID/artifacts
    

    詳情請參閱「列出可用的構件」。

驗證範圍不足的靜態 Managed Service for Apache Spark 叢集

如果您使用以驗證範圍不足為由建立的靜態 Managed Service for Apache Spark 叢集,管道記錄中可能會顯示下列錯誤:

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.

如要解決這個問題,請建立新的靜態 Managed Service for Apache Spark 叢集,並在相同專案中為這個叢集啟用 cloud-platform 範圍。