本页面介绍了如何解决与 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"
出现此错误是因为 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 表中。
如需解决此问题,请按以下步骤操作:
停用 CDC 实例:
EXEC sp_cdc_disable_table @source_schema = N'dbo', @source_name = N'myTable', @capture_instance = 'dbo_myTable' GO
再次启用 CDC 实例:
EXEC sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'myTable', @role_name = NULL, @capture_instance = 'dbo_myTable' GO
创建新的复制作业。
如需了解详情,请参阅处理对源表的更改。
角色和权限错误
访问权限控制会出现以下问题。
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 Admin (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 Agent 未运行
如果 SQL Server Agent 未运行,您可能会在流水线日志中看到以下错误:
No maximum LSN recorded in the database; please ensure that the SQL Server Agent
is running [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]
要解决此问题,请启动 SQL Server Agent。如需了解详情,请根据您所使用的操作系统参阅以下文档:
- Windows:启动 SQL Server 浏览器或 SQL Server 代理实例
- Linux:启用 SQL Server 代理
SQL Server Replication 流水线版本不是最新版本
如果 SQL Server Replication 流水线版本不是最新版本,则流水线日志中会显示以下错误:
Method io/cdap/delta/sqlserver/SqlServerDeltaSource.configure(Lio/cdap/delta/api/SourceConfigurer;) is abstract
如果早期版本的源插件使用的是相对较新的 Delta 应用,就会出现此错误。在这种情况下,新版 Delta 应用定义的新接口不会实现。
如需解决此问题,请按以下步骤操作:
通过提交 HTTP GET 请求检索有关复制作业的信息:
GET v3/namespaces/NAMESPACE_ID/apps/REPLICATOR_NAME
如需了解详情,请参阅查看复制作业详情。
检查复制作业使用的插件和增量应用版本。
通过提交 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
范围。