排解複製工作問題

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

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

違反 bucket 命名慣例時,複製工作可能會失敗,並在管道記錄中顯示以下錯誤:

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.

不同版本的 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

Dataproc 靜態叢集中的複製錯誤

執行複製工作時,Dataproc 叢集節點的 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"

發生這個錯誤的原因是,Conscrypt SSL 供應器已設定為在 Dataproc 上安裝的 JDK 版本中使用。

如要解決這個問題,請停用 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 資料庫執行複製工作時,擷取資料表清單可能會失敗,並顯示以下錯誤訊息:

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 Replication 管道版本不是最新版本,管道記錄中會顯示以下錯誤:

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

如果舊版來源外掛程式與相對較新的 Delta 應用程式版本搭配運作,就會發生這個錯誤。在這種情況下,新版 Delta 應用程式定義的新介面不會實作。

如要解決這個問題,請按照下列步驟操作:

  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 範圍。