MySQL 实时同步至 DLC 指引

最近更新时间:2024-09-05 18:04:11

我的收藏
本文档将手把手的指引您完成 MySQL 实时同步至 DLC 的流程操作,包括整库迁移和单表同步。大体的流程如下:
一、数据源兼容情况。
二、MySQL 环境准备。
三、DLC 环境准备。
四、项目配置及资源组准备。
五、实时整库:MySQL 同步至 DLC 配置步骤。
六、实时单表:MySQL 同步至 DLC 配置步骤。
七、实时节点高级参数。
八、常见问题。

一、数据源兼容情况

MySQL 数据源

如果您想使用 MySQL 进行实时数据同步操作,需要先确认 MySQL 数据源版本支持情况、使用限制及支持的数据类型转换。

支持版本

目前数据集成已支持 MySQL 单表及整库级实时读取,使用实时读取能力需遵循以下版本限制:
类型
版本
Driver
MySQL
5.6,5.7,8.0.x
JDBC Driver:8.0.21
RDS MySQL
5.6,5.7, 8.0.x
PolarDB MySQL
5.6,5.7,8.0.x
Aurora MySQL
5.6,5.7,8.0.x
MariaDB
10.x
PolarDB X
2.0.1

使用限制

需要开启 Binlog 日志,仅支持同步 MySQL 服务器 Binlog 配置格式为 ROW。
无主键的表由于无法保证 exactly once 可能会有数据重复,因此实时同步任务要保证有主键。
不支持 XA ROLLBACK,实时同步的任务不会针对 XA PREPARE 的数据进行回滚的操作,若要处理 XA ROLLBACK 场景,需要手动将 XA ROLLBACK 的表从实时同步任务中移除,再添加表后重新进行同步。
设置 MySQL 会话超时:
当为大型数据库制作初始一致快照时,您建立的连接可能会在读取表时超时。您可以通过在 MySQL 配置文件中配置 interactive_timeout 和 wait_timeout 来防止这种行为。
interactive_timeout:服务器在关闭交互式连接之前等待其活动的秒数。请参阅 MySQL :: MySQL 8.0 Reference Manual :: 7.1.8 Server System Variables
wait_timeout:服务器在关闭非交互式连接之前等待其活动的秒数。请参阅 MySQL :: MySQL 8.0 Reference Manual :: 7.1.8 Server System Variables

MySQL 读取数据类型转换

MySQL 读取支持的数据类型以及内部映射字段如下所示(在处理 MySQL 时,会先将 MySQL 数据源的数据类型和数据处理引擎的数据类型做映射):
字段类型
是否支持
内部映射字段
备注
TINYINT
TINYINT
TINYINT(1) 映射到 BOOLEAN
需要增加选项支持 TINYINT(1) 可以映射到 bool 或者 tinyint
SMALLINT
SMALLINT
-
TINYINT_UNSIGNED
SMALLINT
-
TINYINT_UNSIGNED_ZEROFILL
SMALLINT
-
INT
INT
-
INTEGER
INT
-
YEAR
INT
-
MEDIUMINT
INT
-
SMALLINT_UNSIGNED
INT
-
SMALLINT_UNSIGNED_ZEROFILL
INT
-
BIGINT
LONG
-
INT_UNSIGNED
LONG
-
MEDIUMINT_UNSIGNED
LONG
-
MEDIUMINT_UNSIGNED_ZEROFILL
LONG
-
INT_UNSIGNED_ZEROFILL
LONG
-
BIGINT_UNSIGNED
DECIMAL
DECIMAL(20,0)
BIGINT_UNSIGNED_ZEROFILL
DECIMAL
DECIMAL(20,0)
SERIAL
DECIMAL
DECIMAL(20,0)
FLOAT
FLOAT
-
FLOAT_UNSIGNED
FLOAT
-
FLOAT_UNSIGNED_ZEROFILL
FLOAT
-
DOUBLE
DOUBLE
-
DOUBLE_UNSIGNED
DOUBLE
-
DOUBLE_UNSIGNED_ZEROFILL
DOUBLE
-
DOUBLE_PRECISION
DOUBLE
-
DOUBLE_PRECISION_UNSIGNED
DOUBLE
-
ZEROFILL
DOUBLE
-
REAL
DOUBLE
-
REAL_UNSIGNED
DOUBLE
-
REAL_UNSIGNED_ZEROFILL
DOUBLE
-
NUMERIC
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
NUMERIC_UNSIGNED
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
NUMERIC_UNSIGNED_ZEROFILL
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
DECIMAL
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
DECIMAL_UNSIGNED
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
DECIMAL_UNSIGNED_ZEROFILL
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
FIXED
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
FIXED_UNSIGNED
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
FIXED_UNSIGNED_ZEROFILL
DECIMAL
采用用户数据库实际的精度 p<=38 映射到 DECIMAL 38 < p <= 65 时映射到 String
BOOLEAN
BOOLEAN
-
DATE
DATE
-
TIME
TIME
-
DATETIME
TIMESTAMP
-
TIMESTAMP
TIMESTAMP
-
CHAR
STRING
-
JSON
STRING
-
BIT
STRING
BIT(1) 映射到 BOOLEAN
VARCHAR
STRING
-
TEXT
STRING
-
BLOB
STRING
-
TINYBLOB
STRING
-
TINYTEXT
STRING
-
MEDIUMBLOB
STRING
-
MEDIUMTEXT
STRING
-
LONGBLOB
STRING
-
LONGTEXT
STRING
-
VARBINARY
STRING
-
GEOMETRY
STRING
-
POINT
STRING
-
LINESTRING
STRING
-
POLYGON
STRING
-
MULTIPOINT
STRING
-
MULTILINESTRING
STRING
-
MULTIPOLYGON
STRING
-
GEOMETRYCOLLECTION
STRING
-
ENUM
STRING
-
BINARY
BINARY
BINARY(1)
SET
-
-

DLC 数据源

如果您想进行实时数据同步至 DLC 操作,需要先确认 DLC 数据源的使用限制支持的数据类型转换。

使用限制

当前仅支持 DLC Iceberg 格式的表。
选择 Upsert 模式同步时,DLC 表的表必须是 V2 表,并且开启设置 write.upsert.enabled=true。
选择 Upsert 模式同步时候,必须指定主键,如果是一个分区表,分区字段也必须添加到主键中。

数据类型转换支持

读取
DLC 数据类型
内部类型
INTEGER
Long
FLOAT、DOUBULE、DECIMAL
Double
STRING、VARCHAR、CHAR、ARRAY
String
TIMESTAMP、DATE、TIMESTAMP WITH TIME ZONE
Date
BOOLEAN
Boolean
写入
内部类型
DLC 数据类型
Long
INTEGER
Double
FLOAT、DOUBULE、DECIMAL
String
STRING、MAP、STRUCT
Date
TIMESTAMP、DATE、TIMESTAMP WITH TIME ZONE
Boolean
BOOLEAN
Bytes
BINARY

二、MySQL 环境准备

确认 MySQL 版本

数据集成对 MySQL 版本有要求,查看当前待同步的 MySQL 是否符合版本要求。您可以在 MySQL 数据库通过如下语句查看当前 MySQL 数据库版本。
select version();

设置 MySQL 服务器权限

您必须定义一个对 Debezium MySQL 连接器监控的所有数据库具有适当权限的 MySQL 用户。
1. 创建 MySQL 用户(可选)
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
2. 向用户授予所需的权限:
在实时数据同步的情况下,该账号必须拥有数据库的 SELECT、REPLICATION SLAVE 和 REPLICATION CLIENT 权限。执行命令可以参考下面:
mysql> GRANT SELECT, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';
说明:
启用 scan.incremental.snapshot.enabled 时不再需要 RELOAD 权限(默认启用)。
3. 刷新用户的权限:
mysql>FLUSH PRIVILEGES;
查看更多关于权限说明

开启 MySQL Binlog

1. 检查 binlog 是否开启
show variables like "log_bin"
返回结果为 ON 时,表示已经开启 Binlog, 如果为备库,使用如下语句:
show variables like "log_slave_updates";
如果返回为 ON 时,表示已经开启 Binlog,如果已经开启 Binlog,可跳过下面流程。
2. 开启 Binlog
如果确认没有开启 Binlog,则需要进行以下操作。
对于腾讯云实例 MySQL / TDSQL-C MySQL,默认开启了 binlog。
对于开源 MySQL,参考官方文档开启 binlog。
3. 修改 Binlog 格式为 Row
3.1 实时同步仅支持同步 MySQL 服务器 Binlog 配置格式为 ROW,使用如下语句查询 Binlog 的使用格式。
show variables like "binlog_format";
3.2 如果返回非 ROW 请修改 Binlog Format。
对于腾讯云实例 MySQL / TDSQL-C MySQL:
登录腾讯云 MySQL / TDSQL-C MySQL 控制台,找到要开启 Binlog 的实例,单击进入该实例的详细信息页面。
在上面选项卡中选择数据库管理,找到参数设置选项卡。
在参数设置选项卡中,找到 binlog_format 参数,将其设置为 “ROW”。



4. binlog_row_image
实时同步仅支持同步 MySQL 服务器 binlog_row_image 配置格式为 FULL or full。
4.1 使用如下语句查询 binlog_row_image 的使用格式。
show variables like "binlog_row_image";
4.2 如果返回非 FULL/full 请修改 binlog_row_image:
对于腾讯云实例 MySQL / TDSQL-C MySQL:
登录腾讯云 MySQL / TDSQL-C MySQL 控制台,找到要开启 Binlog 的实例,单击进入该实例的详细信息页面。
在上面选项卡中选择数据库管理,找到参数设置选项卡。
在参数设置选项卡中,找到 binlog_row_image 参数,将其设置为“FULL”。




开启 GTIDs(可选)

GTID(Global Transaction Identifier, 全局事务标识),用于在 binlog 中唯一标识一个事务,使用 GTID 可以避免事务重复执行导致数据混乱或者主从不一致。
1. 检查是否开启了 GTID
show global variables like '%GTID%';
返回结果类似如下,证明已经开启 GTID。
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | enforce_gtid_consistency | ON | | gtid_mode | ON | +--------------------------+-------+
2. 开启 GTID
对于腾讯云实例 MySQL / TDSQL-C MySQL,默认为开启,不支持关闭。

添加腾讯云 MySQL 数据库安全组

安全组是一种有状态的包含过滤功能的虚拟防火墙,用于设置单台或多台云数据库的网络访问控制,是腾讯云提供的重要的网络安全隔离手段。如果您使用的腾讯云 MySQL 数据库高于基础版,您需要将下列访问 IP 加到目标数据库的安全组中。如果您不配置安全组,在 WeData 中配置 MySQL 数据源的时候可能会出现连通性测试失败的情况。具体操作可参见 管理云数据库安全组
118.89.220.0/24, 139.199.116.0/24, 140.143.68.0/24, 152.136.131.0/24, 81.70.150.0/24, 81.70.161.0/24, 81.70.195.0/24, 81.70.198.0/24, 82.156.22.0/24, 82.156.221.0/24, 82.156.23.0/24, 82.156.24.0/24, 82.156.27.0/24, 82.156.82.0/24, 82.156.84.0/24, 82.157.119.0/24

三、DLC 环境准备

检查 WeData 是否有访问 DLC 的权限

1. 登录腾讯云控制台,进入访问管理(CAM)页面。
2. 在左侧菜单中选择用户,找到您需要绑定策略的用户。
3. 单击该用户的名称,进入用户详情页。在权限栏搜索 QcloudWeDataExternalAccess,如果已经关联了该策略,下面步骤可以跳过。



4. 在用户详情页中,找到权限管理模块下的关联策略
5. 单击关联策略中的新建关联按钮。选择从策略列表中选取策略关联,并输入QcloudWeDataExternalAccess
6. 勾选 QcloudWeDataExternalAccess,单击下一步按钮,完成策略绑定。



绑定成功后,该用户即可使用 QcloudWeDataExternalAccess 策略中定义的权限。

检查表是 V1 表还是 V2 表(可选)

实时同步到 DLC,支持两种模式:Append 模式 Upsert 模式。其中 Upsert 模式必须为 V2 表。使用下面命令查看创建的表属性。
SHOW TBLPROPERTIES `DataLakeCatalog`.`databases_name`.`table_name`;
返回结果如下,format-version = 2 表示创建的是 V2表。如果您创建的 V1表,想改成 V2表,可参考 修改表属性




创建 DLC 表(可选)

实时整库任务支持在任务运行期间自动创建 DLC 目标端不存在的目标表,也支持使用已存在的 DLC 目标表。用户可选择事先在 DLC 创建好目标表,也可选择让实时整库迁移任务自动建表。
1. 创建 V1 表
DLC 默认创建的表为 V1表,V1表不支持 Upsert 模式。建表语句参考下面:
CREATE TABLE IF NOT EXISTS `DataLakeCatalog`.`dbname`.`test_v1` (`id` int, `name` string, `ts` date) PARTITIONED BY (`ts`);
2. 创建 V2 表
使用 Upsert 模式的写入 DLC,需要创建 V2 表,需要在建立表的时候指定,建表语句参考下面:
创建 V2表,也一定要设置 'write.upsert.enabled' = 'true' 否则仍然是 Append 模式。
CREATE TABLE IF NOT EXISTS `DataLakeCatalog`.`dbname`.`test_v2` (`id` int, `name` string, `ts` date) PARTITIONED BY (`ts`) TBLPROPERTIES (
'format-version' = '2', -- 创建 V2 表
'write.upsert.enabled' = 'true', -- 写入时做 upsert 操作,只支持 V2 表
'write.distribution-mode' = 'hash', -- 定义写入数据的分布,设置为hash,支持多并发写入
'write.update.mode' = 'merge-on-read' -- 写入更新模式,在写入的时候做merge操作,只支持 V2 表
)
3. 修改表属性(可选)
对于已经创建了的表,需要修改其属性,可以参考下面语法:
SHOW TBLPROPERTIES table_name [('property_name')]
更多 DLC SQL 语法,可以参考 SQL 语法概览
下面是将已经存在的 V1 表改成 V2 表的示例:
ALTER TABLE
`DataLakeCatalog`.`database_name`.`table_name`
SET
TBLPROPERTIES (
'format-version' = '2',
'write.upsert.enabled' = 'true'
)

四、项目配置及资源组准备

在正式配置同步任务之前,需要创建一个项目。如下基于一个全新的环境讲解相关步骤,如果您已经创建了项目成员或完成了项目创建可以跳过。

项目创建

如果您还没有在数据开发治理平台 WeData 创建过项目空间,在进行数据同步任务之前需完成项目创建。
1. 主账号人员进入 CAM 控制台添加子账号,可以参考 准备 CAM 子账号,创建后,该成员便可以使用设置的子账号登录 WeData 大数据平台。
2. 创建项目空间,需要进入 WeData 首页,单击项目列表 > 创建项目。 如果只是做数据集成,此处可以选择仅创建项目,输入项目标识和名称即可。




添加成员

创建完的项目只有项目所有者和主账号有权限进入。其他子账号若想进入需要由项目所有者或主账号在项目管理模块添加成员。详情请查看 项目管理
1. 单击项目管理 > 成员与角色管理,进入成员与角色管理界面,单击添加按钮。



2. 在添加成员界面,为新创建的成员设置所需角色,设置完成后,该成员便可以进入项目了。




资源组准备

确认资源组是否配置

1. 在正式进行数据集成任务之前,请确认您所在的项目是否已配备集成资源
如果提示未配置集成资源,则无法正常运行数据集成任务。
当您创建完新项目,在执行资源组这一列会显示集成资源未配置,只需要前往 WeData 首页执行资源组 > 集成资源组为新项目关联资源即可。



2. 进入集成资源组界面,单击对应资源组后的关联项目




集成资源组购买

如果发现目前没有集成资源组,需要前往购买。集成资源组是在运行数据集成任务时专享使用到的计算资源,本资源主要以资源组形式展现。在配置同步任务之前需要确认是否购买了数据集成资源组。详情请参见 配置集成资源组

网络连通性确认

需要保证数据源网络(包括读端、写端)与数据集成资源组之间网络互通,且资源不可因为白名单限制等原因被拒绝访问,否则无法完成数据传输同步。
数据集成资源组内包含的机器资源默认需处于同一 VPC 网络环境下:


若数据源开通公网:需要购买并创建 NAT 网关,允许集成资源通过网关连通数据源所在 VPC,详细操作请参见 资源组配置公网
若数据源处于 VPC 内:
若与集成资源位于同一 VPC:可直接使用。
若与集成资源位于不同 VPC:需购买 对等连接 打通集成与数据源所在 VPC。
若数据源位于 IDC 或其他经典网络环境下:需购买 VPN专线网关 打通集成与数据源所在 VPC。
说明:
关于集成资源组连通性与使用规划可查看 集成资源配置与管理

数据源配置

MySQL 数据源配置

进入配置数据源界面,MySQL 数据源支持云实例和连接串两种连接方式。
单击项目管理 > 数据源管理 > 新建数据源 > 选择 MySQL 数据源
通过连接串创建数据源。



参数说明如下:
参数
说明
数据源名称
新建的数据源的名称,由用户自定义且不可为空。命名以字母开头,可包含字母、数字、下划线。长度在20字符以内。
描述
选填,对本数据源的描述。
数据源权限
项目共享表示当前数据源项目所有成员均可使用 ,仅个人和管理员表示改数据源仅创建人和项目管理员可用。
部署方式
支持自建实例、公网实例两种部署方式,其中自建实例为在腾讯云服务器上部署的数据源实例,公网实例为在客户本地IDC或其他云上资源实例,支持通过公网进行访问连接。
区域与网络
当选择自建实例时,需要选择数据源实例所在地域与 vpcID。
JDBC URL
用于连接 MySQL 数据源实例的连接串信息,包含 host ip、port、数据库名称等信息。
数据库名称
需要连接的数据库名称。
用户名
连接数据库的用户名称。
密码
连接数据库的密码。
数据连通性(旧)
测试是否能够连通所配置的数据库。
说明:
若连通性测试不通过,数据源仍可保存。连通性测试未通过而保存但数据源不可使用。
如果连通性测试不通过,可能是因为 WeData 被数据库所在网络防火墙禁止,需要添加腾讯云 MySQL 数据库安全组,可以参考章节二 添加腾讯云 MySQL 数据库安全组
2024年春节后新购买的 WeData 默认无此功能,该功能已升级为资源组连通性。
资源组连通性(新)
支持具体资源组与数据源的连通性测试。用户只需保证自身数据源和集成资源组所在VPC网络能通即可,无需做额外的网络打通。



说明:
2024年春节前购买 WeData 的用户无此功能,若需要使用,请联系腾讯侧运维人员处理。

DLC 数据源配置

WeData 目前支持通过连接串方式引入 DLC 数据源。
单击项目管理 > 数据源管理 > 新建数据源 > 选择 DLC 数据源。



参数
说明
数据源名称
新建数据源的标识名称,由用户自定义且不可为空。命名以字母开头,可包含字母、数字、下划线,长度在20字符以内。类似唯一标识,不支持修改
显示名
新建数据源的显示名称,由用户自定义且支持修改。显示名可选填,不填默认显示数据源名称。
描述
选填,对本数据源的描述
数据源权限
项目共享表示当前数据源项目所有成员均可使用 ,仅个人和管理员表示改数据源仅创建人和项目管理员可用
JDBC URL
用于连接 DLC 数据源的连接串信息
数据连通性(旧)
测试是否能够连通所配置的数据库。
说明:
若连通性测试不通过,数据源仍可保存。连通性测试未通过而保存但数据源不可使用。
2024年春节后新购买的 WeData 默认无此功能,该功能已升级为资源组连通性。
资源组连通性(新)
支持具体资源组与数据源的连通性测试。用户只需保证自身数据源和集成资源组所在VPC网络能通即可,无需做额外的网络打通。



说明:
2024年春节前购买 WeData 的用户无此功能,若需要使用,请联系腾讯侧运维人员处理。

五、实时整库:MySQL 同步至 DLC

当企业需要将整个数据库迁移到新的平台或环境时,整库同步可以一次性同步所有表和数据,确保数据的完整性和一致性。

步骤一:创建整库迁移任务

登录打开 WeData 后,进入数据集成模块,然后单击配置中心 > 实时同步任务页面后,单击新建整库迁移任务。




步骤二:链路选择

在链路选择界面,选择 MySQL > DLC 链路,选择完成后,单击下一步




步骤三:数据来源设置




参数
说明
数据源
选择需要同步的 MySQL 数据源。
来源表
所有库表:监控数据源下所有库。任务运行期间新增库、表默认将同步至目标端。
指定表:此选项下需指定到具体表名称,设置后任务仅同步指定表;若需要新增同步表需停止并重启任务。

指定库:此选项下需指定具体库名、以表名正则表达式。设置后,任务运行期间符合表名表达式的新增表默认将同步至目标端。


常用表名正则表达式:
单个库的所有表: .*
单个库的部分表: table1|table2|table3
排除某些表的所有表:^(?!(exclude1|exclude2|exclude3)$).*$
排除某些表但包括以a开头的所有表:^(?!(exclude1|exclude2|exclude3)$)(^a.*)$
读取模式
全量 + 增量:数据同步分为全量和增量同步阶段,全量阶段完成后任务进入增量阶段。全量阶段将同步库内历史数据,增量阶段从任务启动后 binlog cdc 的位点开始同步。
仅增量:仅从任务启动后的 binlog cdc 位点开始同步数据。
过滤操作
支持插入、更新和删除三种操作,设置后将不同步指定操作类型的数据。
时区
设置日志时间所属时区,默认上海。
高级设置(可选)
可根据业务需求配置参数。

步骤四:数据目标设置




参数
说明
数据去向
选择需要同步的目标数据源。
写入模式
upsert:更新写入。当主键不冲突时,可插入新行;当主键冲突时,则进行更新。适用于目标表有主键且需要根据源端数据实时更新的场景。会有一定的性能损耗.
append:追加写入。无论是否有主键,以插入新行的方式追加写入数据,是否存在主键冲突取决于目标端。适用于无主键且允许数据重复的场景。无性能损耗。
全量append+增量upsert:根据源端数据同步阶段自动切换数据写入方式,全量阶段采用append写入提高性能,增量阶段采用upsert写入进行数据实时更新。该模式当前仅支持来源端为Mysql、Oracle、TDSQL MySQL的数据源。
库/表匹配策略
DLC 中数据库以及数据表对象的名称匹配规则。
批量建表
DLC 目标端支持根据库表匹配策略批量一键建表:
确认键表规则:确认键表信息如数据来源、来源库等,支持预览/编辑表语句。



基本信息:展示选择或填写的库匹配策略、表匹配策略、目标数据源、以及表匹配详情。
建表规则:
元数据写入:可以选择是否写入元数据,MySQL > DLC支持的元数据如下:
database_wedata_di (管理参数 database,表示数据库名称)
table_wedata_di(管理参数 table,表示数据表名)
type_wedata_di (管理参数 type,表示操作类型)
ts_wedata_di(管理参数 ts,表示日志时间)
processing_time_wedata_di (处理时间,当前系统处理本条记录的机器本地时间)
匹配失败的库/表:展示在目标数据源中根据库表匹配规则未匹配到的库表
匹配成功的库/表:展示在目标数据源中根据库表匹配规则匹配到的库表
预览/编辑表语句:可以通过预览自动生成的建表语句,且能够直接对建表语句进行编辑

批量修改表创建方式:支持批量对表创建方式进行修改
匹配失败表创建方式:
新建表:支持改为暂不新建
暂不新建:支持改为新建表
匹配成功表创建方式
使用已有表:支持改为删除已有表并新建
删除已有表并新建:支持改为使用已有表



批量键表:展示建表结果,支持查看建表语句、重试。

写入优化
写入优化适用于频繁写入/实时写入的场景。开启写入优化会自动合并文件、删除过期快照。强烈建议您在实时 Upsert 写入的场景下开启写入优化。详情请参见 数据优化
数据优化资源
数据优化视数据写入情况可能产生大量任务,占用您的集群资源,为避免和正常业务相互影响,强烈建议此处用单独的集群资源。数据优化支持 SuperSQL 引擎 > SparkSQLSuperSQL 引擎 > Spark 作业,如有生命周期管理的需求,请使用 SuperSQL 引擎 > Spark 作业引擎。
高级设置
可根据业务需求配置参数。

步骤五:运行设置

当前步骤主要是为任务配置资源、DDL 和异常数据处理策略、以及高级运行参数等。



1. 集成资源配置:
为当前任务关联对应的集成资源组,同时设定运行时 JM、TM 规格以及任务运行并行度。其中,当前任务实际运行时实际占用 CU数 = JobManager 规格 + TaskManager 规格 × 并行度。
资源分配方式:集成资源支持多种分配方式
固定分配:此方式下不区分任务同步阶段,全量及增量同步过程中始终为当前任务分配固定资源量。此方式可避免任务间资源抢占,适用于任务运行过程中数据可能存在较大变动的场景。
按同步阶段分配:按全量和增量不同同步阶段分配计划的资源使用量,以节约整体资源用量。
2. 表及字段变更策略:
MySQL > DLC 整库链路支持以下 DDL 变更:
表及字段变更类型
支持策略
新增表
自动建表、忽略变更、日志告警、任务出错
删除表
忽略变更、日志告警、任务出错
重命名表
忽略变更、日志告警、任务出错
清空表
忽略变更、日志告警、任务出错
新增列
自动新增列、忽略变更、日志告警、任务出错
删除列
自动变更、忽略变更、日志告警、任务出错
重命名列
自动变更、忽略变更、日志告警、任务出错
修改列类型
自动变更、忽略变更、日志告警、任务出错
如下是上表中支持的策略和表现效果:
策略名称
表现效果
忽略变更
1. 目标端表/字段不做任何变更
2. 任务正常运行,默认忽略变更
日志告警
1. 目标端表/字段不做任何变更
2. 任务正常运行,但是日志中提醒 DDL 变更消息详情
任务停止
1. 目标端表/字段不做任何变更
2. 任务异常重启
自动变更
目标端根据来源端自动发生变更,自动创建出目标侧对象。例如,新增表、新增列等。
说明:
为了避免误操作造成结构变化从而影响用户业务,目前仅新增相关变更,如新增表/列,支持自动处理;其余高危操作,如清空表、删除表、重命名表等操作仅支持“提醒式”响应策略(例如,告警、停止)
3. 元数据写入
当 DDL 策略中的新增表选择自动建表时,您可以选择是否进行元数据写入。勾选对应的元数据字段会在目标表中创建相应的元数据字段,同步过程中写入相应系统元数据。目前 MySQL > DLC 整库链路支持以下元数据字段:



4. 写入异常策略:
DLC 整库同步任务提供任务级运行资源及数据失败写入处理策略。其中数据写入失败处理策略支持四种:
策略名称
策略说明
部分停止
部分表写入异常时,仅停止该表数据写入,其他表正常同步。已停止的表不可在本次任务运行期间恢复写入。
异常重启
部分表写入异常时,所有表均暂停写入。此策略下任务将持续重启直到所有表正常同步,重启期间可能导致部分表数据重复写入。
忽略异常
忽略表内无法写入的异常数据并标记为脏数据。该表的其他数据、以及任务内的其他表正常同步。脏数据提供 COS 归档和不归档两种方案。
COS 归档:将无法写入的脏数据进行归档,需要配置 COS 数据源、存储桶、存储目录、内容分隔符及换行符。
不归档:不需要做其他操作。
场景示例:
任务 Task1 下计划同步50张表,任务运行过程中表 A 内出现新增字段或字段类型变更:
部分停止:表 A 任务运行后将字段 "DEMO" 的进行了字段类型变更,并且变更后字段类型与目标端字段类型无法匹配写入。此策略下,任务将在停止源端表 A 的数据读取,后续任务仅同步其余49张表至目标端。
异常重启:表 A 任务运行后将字段 "DEMO "的进行了字段类型变更,并且变更后字段类型与目标端字段类型无法匹配写入。此策略下任务将在持续重启,期间任务内配置的所有50张表将暂停数据写入,直到表A字段纠正。
忽略异常:表 A 任务运行后将字段 "DEMO" 的进行了字段类型变更,并且变更后字段类型与目标端字段类型无法匹配写入。此策略下任务将忽略无法写入的异常数据,并标记为脏数据,表内其他数据正常同步。
5. 任务运行策略:
为当前任务设置提交间隔、最大重启次数以及任务级运行参数等。

参数
说明
checkpoint 间隔
当前任务提交的最大 checkpoint 间隔。
最大重启次数
设置在执行过程中发生故障时任务最大的重启阈值,若运行中重启次数超过此阈值,任务状态将置为失败,设置范围为[-1,100]。其中
阈值为0表示不重启;
-1 表示不限制最大重启次数。
参数
设置任务级别运行参数。不同来源及目标端支持的任务级参数存在差异,详情请参见 实时节点高级参数

步骤六:配置预览

通过配置预览,您可以一次性查看链路选择、数据来源设置、数据目标设置、运行设置所配置的全部结果,以确保任务配置信息的准确、合理。

步骤七:任务配置检测与提交

当完成上面六个步骤,可以进行任务配置检测和正式提交任务,此时可以单击左上角的提交按钮,进入任务配置检查和提交阶段。



步骤
步骤说明

任务配置检测
本步骤将针对任务内读端、写端以及资源进行检测:
检测通过:配置无误。
检测失败:配置存在问题,需修复以进行后续配置。
检测告警:此检测为系统建议修改项,修改完成后可单击重试重新检测;或者,您可以单击忽略异常进入下一步骤不阻塞后续配置。

当前支持的检测项见后续表格。



提交策略选择
本步骤中可选择本次任务提交策略:
首次提交:首次提交任务支持从默认或指定点位同步数据
立即启动,从默认点位开始同步:若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后消费binlog获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
立即启动,从指定时间点开始同步:任务将根据配置的时间及时区同步数据。若未找到指定的时间位点,任务将默认从 binlog 最早位点开始同步;若源端读取方式为“全量 + 增量”,任务将默认跳过全量阶段从增量的指定时间位点开始同步。
暂不启动:提交后暂不启动运行任务,后续可在运维列表内手动启动任务。
非首次提交:支持带运行状态启动或继续运行任务
继续运行:此策略下新版本任务提交后,将从上次同步最后位点继续运行。
重新启动,从指定位点开始:此策略下您可指定重新启动读取的位点,任务将忽略老版本从指定位点重新开始读取。若未找到指定的时间位点任务将默认从 binlog 最早位点开始同步。
重新启动,从默认位点开始运行:此策略下将根据源端配置从默认位点开始读取。若源端配置为“全量+增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费 binlog 获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
不同的任务状态支持的提交运行策略有所差异,详见后续表格。

同时,每次提交都将新生成一个实时任务版本,您可在对话框内配置版本描述。
1. 首次提交



2.非首次提交



任务提交
提交成功后,您可单击前往运维查看任务运行情况。



任务配置检测支持的检测项:
检测分类
检测项
说明
任务配置检测
来源配置
检测来源端的必填项是否有缺失
目标配置
检测目标端的必填项是否有缺失
映射关系配置
检测字段映射是否已配置
资源组配置
检测资源组是否有配置
数据源检测
来源端连通性检测
检测来源端数据源跟任务配置的资源组是否网络联通。检测不通过可查看诊断信息,打通网络后可重新检测,否则任务大概率会运行失败。
目标端连通性检测
检测目标端数据源跟任务配置的资源组是否网络联通。检测不通过可查看诊断信息,打通网络后可重新检测,否则任务大概率会运行失败。
资源检测
资源状态检测
检测资源组是否为可用状态。若资源状态不可用,请更换任务配置的资源组,否则任务大概率会运行失败。
资源余量检测
检测资源组当前剩余的资源是否满足任务配置的资源需求。若检测不通过,请适当调小任务资源配置或扩容资源组。
不同的任务运行状态支持的提交运行策略:
任务状态
提交运行策略
说明
1、首次提交
2、已停止/检测异常/初始化(非首次提交)
立即启动,从默认位点开始同步
此策略下将根据源端配置从默认位点开始读取。若源端配置为“全量+增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费binlog获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用binlog最新位点开始读取。
立即启动,指定时间点开始同步
此策略下需选择具体的开始时间,根据时间匹配位点。
1. 从指定时间点开始读取数据。若未匹配到指定位点,任务则默认从 binlog 最早位点开始同步
2. 若您源端读取方式为全量 + 增量,选择此策略将默认跳过全量阶段从增量的指定时间位点开始同步
暂不启动,稍后前往实时任务运维手动启动任务
此策略下仅提交任务到实时运维,不进行任务启动,后续可从实时运维页面批量启动任务。
运行中
(非首次提交)
继续运行,保留作业状态数据,从上次同步最后位点继续运行
此策略下新版本任务提交后,将从上次同步最后位点继续运行。
重新启动,从指定时间点继续运行
此策略下您可指定重新启动读取的位点,任务将忽略老版本从指定位点重新开始读取。若未找到指定的时间位点任务将默认从binlog最早位点开始同步。
重新启动,停止正在运行任务并丢弃任务状态,从默认位点开始运行
此策略下将停止正在运行的任务并丢弃任务状态,然后根据源端配置从默认位点开始读取。若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费 binlog 获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
已暂停
(非首次提交)
继续运行,保留作业状态数据,从上次同步最后位点继续运行
此策略下新版本任务提交后,将从上次同步最后位点继续运行。
注意:
暂停操作时会生成快照,任务重新提交支持从最后位点继续运行。
强制暂停时不生成快照,任务重新提交支持从任务运行时最近一次生成的快照运行。这种暂停会导致任务数据重放一部分,如果目标写入是 Append 会有重复的数据,如果目标写入是 Upsert 则不会有重复问题。
重新启动,从指定时间点继续运行
此策略下您可指定重新启动读取的位点,任务将忽略老版本从指定位点重新开始读取。若未找到指定的时间位点任务将默认从 binlog 最早位点开始同步。
重新启动,停止正在运行任务并丢弃任务状态,从默认位点开始运行
此策略下将停止正在运行的任务并丢弃任务状态,然后根据源端配置从默认位点开始读取。若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费 binlog 获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
失败
(非首次提交)
从上次运行失败(checkpoint)位点恢复运行
此策略下将从任务上一次运行失败的位点继续运行
重新启动,根据任务读取配置从默认位点开始运行
此策略下将根据源端配置从默认位点开始读取。若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费binlog获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用binlog最新位点开始读取。
操作中
(非首次提交)
不支持
线上有同名任务且状态为操作中时,不支持重新提交任务

步骤八:实时任务运维

内容请参见 实时运维操作

六、实时单表:MySQL 同步至 DLC

当业务只需要关注某个特定表的数据时,单表同步可以针对性地同步特定表的数据,这样可以减少不必要的数据处理和传输,提高同步效率。
在数据集成页面左侧目录栏单击实时同步,在实时同步页面上方选择单表同步新建并进入配置页面。配置单表同步时支持两种模式:单表模式画布模式。后续以表单模式为例讲解配置流程。




步骤一:配置 MySQL 读取节点

1. 在数据集成页面左侧目录栏单击实时同步
2. 在实时同步页面上方选择单表同步新建(可选择表单和画布模式)并进入配置页面。
3. 选择 MySQL 节点并配置节点信息。



4. 参数信息:
数据来源
选择该项目可用的 MySQL 数据源。
支持选择、或者手动输入需读取的库名称。
默认将数据源绑定的数据库作为默认库,其他数据库需手动输入库名称。
当数据源网络不联通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
支持选择、或者手动输入需读取的表名称。
分表情况下,可在 MySQL 源端支持选择或输入多个表名称,多个表需保证结构一致。
分表情况下,支持配置表序号区间。例如'table_[0-99]'表示读取'table_0'、'table_1'、'table_2'直到'table_99' ; 如果您的表数字后缀的长度一致,例如'table_000'、'table_001'、'table_002'直到'table_999',您可以配置为'"table": ["table_00[0-9]", "table_0[10-99]", "table_[100-999]"]' 。
当数据源网络不联通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
添加分库分表
适用于分库场景,单击后可配置多个数据源、库及表信息。分库分表场景下需保证所有表结构一致,任务配置将默认展示并使用第一个表结构进行数据获取。
分片列
分片列用于将表分为多个分片进行同步。有主键的表建议优先选择表主键作为分片列;
无主键的表建议选择有索引的列作为分片列,且保证分片列不存在数据的更新操作,否则只能保证 At-Least-Once 语义。
读取模式
支持全量 + 增量和仅增量两种模式。
一致性语义
Exactly-once
At-least-once
注意:
仅代表读取端的一致性语义。当前版本两种模式状态不兼容,任务提交后如果修改模式,不支持带状态重启。
过滤操作
设置后将不同步指定操作类型的数据,支持插入、更新和删除。
时区
设置日志时间所属时区,默认上海。
高级设置(选填)
可根据业务需求配置参数。
5.预览数据字段,单击保存

步骤二:配置 DLC 写入节点

1. 在数据集成页面左侧目录栏单击实时同步
2. 在实时同步页面上方选择单表同步新建(可选择表单和画布模式)并进入配置页面。
3. 选择 DLC 节点并配置节点信息。



4. 参数信息如下表:
参数
说明
数据源
需要写入的 DLC 数据源。
支持选择、或者手动输入需写入的库名称
默认将数据源绑定的数据库作为默认库,其他数据库需手动输入库名称。
当数据源网络不联通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
支持选择、或者手动输入需写入的表名称。
当数据源网络不联通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
写入模式
DLC 实时同步写入支持三种模式:
Upsert:更新写入。当主键不冲突时,可插入新行;当主键冲突时,则进行更新。适用于目标表有主键且需要根据源端数据实时更新的场景。会有一定的性能损耗。
Append: 追加写入。无论是否有主键,以插入新行的方式追加写入数据,是否存在主键冲突取决于目标端。适用于无主键且允许数据重复的场景。无性能损耗。
全量 Append + 增量 Upsert:根据源端数据同步阶段自动切换数据写入方式,全量阶段采用 Append 写入提高性能,增量阶段采用Upsert写入进行数据实时更新。该模式当前仅支持来源端为 Mysql、Oracle、TDSQL MySQL 的数据源
唯一键
Upsert写入模式下,需设置唯一键保证数据有序性,支持多选。
写入优化
写入优化适用于频繁写入/实时写入的场景。开启写入优化会自动合并文件、删除过期快照。强烈建议您在实时 Upsert 写入的场景下开启写入优化。详情可以参考文档数据优化
说明:
数据优化资源:数据优化视数据写入情况可能产生大量任务,占用您的集群资源,为避免和正常业务相互影响,强烈建议此处用单独的集群资源。数据优化支持 SuperSQL 引擎 > SparkSQLSuperSQL 引擎 > Spark 作业,如有生命周期管理的需求,请使用 SuperSQL 引擎 > Spark 作业引擎。
高级设置
可根据业务需求配置参数。
5. 预览数据字段并与读取节点配置字段映射,单击保存

步骤三:任务配置检测与提交

当完成上面的步骤,可以进行任务配置检测和正式提交任务,此时可以查看任务配置界面左上角的相关按钮进行后续提交操作。每一个按钮的位置和功能如下:



实时同步任务在配置完成后可配置运行策略并提交到生产环境中运行。目前可在任务配置页面支持保存、提交、锁定/解锁、前往运维及表单/画布转换操作。
序号
参数
说明
1
保存
保存当前任务配置信息,包括数据节点配置、节点连线、任务属性配置。
2
提交
将当前任务提交至生产环境,提交时根据当前任务是否有生产态任务可选择不同运行策略。
若当前任务无生效的线上任务,即首次提交或线上任务处于“失败”状态,可直接提交。
若当前任务存在“运行中”或“暂停”状态的线上任务需选择不同策略。停止线上作业将抛弃之前任务运行位点,从头开始消费数据,保留作业状态将在重启后从之前最后消费位点继续运行。



说明:
单击立即启动任务将在提交后立即开始运行,否则需要手动触发才会正式运行。
3
锁定/解锁
默认创建者为首个持锁者,仅允许持锁者编辑任务配置及运行任务。若锁定者5分钟内没有编辑操作,其他人可点击图标抢锁,抢锁成功可进行编辑操作。
4
前往运维
根据当前任务名称快捷跳转至实时运维页面。
5
刷新
刷新任务配置
6
画布转换/表单转换
表单模式和画布模式可以互相转换。表单模式下提供画布转换功能,画布模式下提供表单转换功能。
说明:
当前仅支持任务在保存成功状态下才允许转换。
若画布模式包含转换节点,不支持转为表单模式。

任务配置检测

任务提交时会进行基础环境和配置检测,请重点关注未通过项和警告项。未通过项大概率会导致任务运行失败,警告项请结合业务情况判断影响。当前检测结果不会阻断任务提交,您可选择重新检测或忽略异常继续提交。




当前支持的检测项:
检测分类
检测项
说明
任务配置检测
来源配置
检测来源端的必填项是否有缺失
目标配置
检测目标端的必填项是否有缺失
映射关系配置
检测字段映射是否已配置
资源组配置
检测资源组是否有配置
相同数据表检测
检测当前项目下所有的实时单表任务(包含已提交和未提交)是否有同样来源表或目标表或来源表与目标表都相同的情况。相同表的判断依据为是否是同一个数据源同一个 DB 下的同名表。此检测项主要用于同一个表不希望有多个任务重复读取的场景。
数据源检测
来源端连通性检测
检测来源端数据源跟任务配置的资源组是否网络联通。检测不通过可查看诊断信息,打通网络后可重新检测,否则任务大概率会运行失败。
目标端连通性检测
检测目标端数据源跟任务配置的资源组是否网络联通。检测不通过可查看诊断信息,打通网络后可重新检测,否则任务大概率会运行失败。
资源检测
资源状态检测
检测资源组是否为可用状态。若资源状态不可用,请更换任务配置的资源组,否则任务大概率会运行失败。
资源余量检测
检测资源组当前剩余的资源是否满足任务配置的资源需求。若检测不通过,请适当调小任务资源配置或扩容资源组。

提交策略选择

正常提交或忽略异常提交后会进入提交策略选择页面,用户可根据业务需求选择不同的运行策略:



不同的任务运行状态支持的提交运行策略有所差异:
任务状态
提交运行策略
说明
1、首次提交
2、已停止/检测异常/初始化(非首次提交)
立即启动,从默认位点开始同步
此策略下将根据源端配置从默认位点开始读取。若源端配置为“全量+增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费binlog获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用binlog最新位点开始读取。
立即启动,指定时间点开始同步
此策略下需选择具体的开始时间,根据时间匹配位点。
1. 从指定时间点开始读取数据。若未匹配到指定位点,任务则默认从binlog最早位点开始同步
2. 若您源端读取方式为全量 + 增量,选择此策略将默认跳过全量阶段从增量的指定时间位点开始同步
暂不启动,稍后前往实时任务运维手动启动任务
此策略下仅提交任务到实时运维,不进行任务启动,后续可从实时运维页面批量启动任务。
运行中
(非首次提交)
继续运行,保留作业状态数据,从上次同步最后位点继续运行
此策略下新版本任务提交后,将从上次同步最后位点继续运行。
重新启动,从指定时间点继续运行
此策略下您可指定重新启动读取的位点,任务将忽略老版本从指定位点重新开始读取。若未找到指定的时间位点任务将默认从 binlog 最早位点开始同步。
重新启动,停止正在运行任务并丢弃任务状态,从默认位点开始运行
此策略下将停止正在运行的任务并丢弃任务状态,然后根据源端配置从默认位点开始读取。若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费 binlog 获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
已暂停
(非首次提交)
继续运行,保留作业状态数据,从上次同步最后位点继续运行
此策略下新版本任务提交后,将从上次同步最后位点继续运行。
注意:
暂停操作时会生成快照,任务重新提交支持从最后位点继续运行。
强制暂停时不生成快照,任务重新提交支持从任务运行时最近一次生成的快照运行。这种暂停会导致任务数据重放一部分,如果目标写入是 Append 会有重复的数据,如果目标写入是 Upsert 则不会有重复问题。
重新启动,从指定时间点继续运行
此策略下您可指定重新启动读取的位点,任务将忽略老版本从指定位点重新开始读取。若未找到指定的时间位点任务将默认从 binlog 最早位点开始同步。
重新启动,停止正在运行任务并丢弃任务状态,从默认位点开始运行
此策略下将停止正在运行的任务并丢弃任务状态,然后根据源端配置从默认位点开始读取。若源端配置为“全量 + 增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费 binlog 获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用 binlog 最新位点开始读取。
失败
(非首次提交)
从上次运行失败(checkpoint)位点恢复运行
此策略下将从任务上一次运行失败的位点继续运行
重新启动,根据任务读取配置从默认位点开始运行
此策略下将根据源端配置从默认位点开始读取。若源端配置为“全量+增量”读取方式,则默认先同步存量数据(全量阶段),完成后即可消费binlog获取变更数据(增量阶段);若源端配置为 “仅增量”读取,则默认使用binlog最新位点开始读取。
操作中
(非首次提交)
不支持
线上有同名任务且状态为操作中时,不支持重新提交任务
同时,每次提交都将新生成一个实时任务版本,您可在对话框内配置版本描述。

提交结果

单击上图提交按钮后,会出现提交进度和提交结果:



任务提交中:
展示提交进度百分比。
任务提交结果 - 成功:
展示任务提交成功结果。
可前往运维进行任务运维管理或返回任务列表
任务提交结果 - 失败:
展示任务提交失败原因

步骤四:实时任务运维

内容请参见 实时运维操作

七、实时节点高级参数

在配置读写节点时,可以配置高级设置,配置内容和使用场景如下所示:

MySQL 类型节点级别

如下为 MySQL 来源端在使用场景下支持的高级设置及其描述:
读/写
适用场景
配置内容:
描述
单表 + 整库
scan.newly-added-table.enabled=true
参数描述
设置这个参数,在暂停 > 继续后可以感知新增的表。默认是 false
1. 全增量同步时使用该参数,新增的表会读取存量数据后再读取增量数据
2. 增量同步时使用该参数,新增的表只会读取增量数据
单表 + 整库
scan.incremental.snapshot.chunk.size=20000
参数描述
对于数据分布均匀的任务,这个参数代表一个 chunk 内大约的条数,可以用总的数据量除以 chunk size 估算任务有多少个 chunk 数,chunk 数的多少影响了 jobmanager 是否 oom,目前 2CU 的情况下可以支持10w多 chunk,如果数据量太大,我们可以调大 chunk size 来减少 chunk 数量
注意事项
大数据量任务(例如,总数据量1个亿以上,单条记录大于0.1M)一般建议设置20000
单表 + 整库
split-key.even-distribution.factor.upper-bound=10.0d
参数描述
mysql 存量数据读取阶段,如果数据比较离散、主键字段的最大值超大,可以修改这个参数,来使用非均匀分割,减少由于主键值超大情况下导致 chunk 数量太大从而 jm oom 的问题
注意事项
默认值为10.0d 一般不用修改
单表 + 整库
debezium.query.fetch.size=0
参数描述
代表每次读取从数据库拉取的数据条数,默认是0代表jdbc 默认的 fetch size
注意事项
1. 大任务(例如,总数据量1个亿以上,单条记录大于0.1M)只有一个读取实例时建议取1024条
2. 任务存在多个读取实例时建议降低这个值,减少内存消耗,建议取512条
单表 + 整库
debezium.max.queue.size=8192
参数描述
属性定义了内部队列中存储的最大事件数。如果达到此限制,Debezium 将暂停读取新事件,直到处理和提交尚未处理的事件。这个属性可以帮助避免过多事件积压在队列中,导致内存耗尽和性能下降。默认是8192
注意事项
1. 大任务(例如,总数据量1个亿以上,单条记录大于0.1M)只有一个读取实例建议取4096
2. 任务存在多个读取实例时建议降低这个值,减少内存消耗,建议取1024

DLC 类型节点级别

如下为 DLC 目标端在使用场景下支持的高级设置及其描述:
读/写
适用场景
配置内容:
描述
单表
write.distribution-mode=none
DLC 并发写入,支持参数 none|hash|range 参数说明:
1. none:存在主键则根据主键进行并发写入,否则单并发写入。
2. hash:存在分区字段,根据分区字段并发写入,否则根据参数 none 的策略写入。
3. range:暂不支持,策略和 none 一致。

八、常见问题

1. MySql serverid 冲突

错误信息:
com.github.shyiko.mysql.binlog.network.ServerException: A slave with the same server_uuid/server_id as this slave has connected to the master。
解决办法:目前已经优化增加随机生成 serverid,之前的任务中如果在 mysql 高级参数中显示指定了 server-id 建议删除,因为可能多个任务使用了相同的数据源,并且 server-id 设置的相同导致冲突。

2. 报 binlog 文件找不到错误信息:

错误信息:
Caused by: org.apache.kafka.connect.errors.ConnectException: The connector is trying to read binlog starting at GTIDs xxx and binlog file 'binlog.xxx', pos=xxx, skipping 4 events plus 1 rows, but this is no longer available on the server. Reconfigure the connector to use a snapshot when needed。
错误原因:
作业正在读取的 binlog 文件在 MySQL 服务器已经被清理时,会产生报错。导致 Binlog 清理的原因较多,可能是 Binlog 保留时间设置的过短;或者作业处理的速度追不上 Binlog 产生的速度,超过了 MySQL Binlog 文件的最大保留时间,MySQL 服务器上的 Binlog 文件被清理,导致正在读的 Binlog 位点变得无效。
解决办法:如果作业处理速度无法追上 Binlog 产生速度,可以考虑增加 Binlog 的保留时间也可以优化作业减轻反压来加速 source 消费。如果作业状态没有异常,可能是数据库发生了其他操作导致 Binlog 被清理,从而无法访问,需要结合 MySQL 数据库侧的信息来确定 Binlog 被清理的原因。

3. MySQL 报连接被重置

错误信息:
EventDataDeserializationException: Failed to deserialize data of EventHeaderV4 .... Caused by: java.net.SocketException: Connection reset。
错误原因:
1. 网络问题。
2. 作业存在反压,导致 source 无法读取数据,binlog client 空闲,如果 binlog 连接在超时后仍然空闲 mysql 服务器会断开空闲的连接。

解决方法:
1. 如果是网络问题,可以调大 mysql 网络参数 set global slave_net_timeout = 120; (默认30s) set global thread_pool_idle_timeout = 120。
2. 如果是作业反压导致,可以通过调节作业减轻反压,例如增加并行度,提升写入速度,提升 taskmanager 内存减少 gc。

4. Mysql2dlc 任务 JobManager Oom

错误信息:



1. 用户数据量比较大,可以调大 jobmanager CU 数,使用 mysql 高级参数 scan.incremental.snapshot.chunk.size 调大 chunk size 大小,默认是8096。
2. 用户数据量不大,但是主键最大值-最小值的差值却很大,导致使用均分 chunk 的策略时划分很多 chunk,修改分布因子,让用户数据走非均匀的数据切分逻辑,split-key.even-distribution.factor.upper-bound=5.0d,默认值分布因子已经修改为10.0d。

5. 用户的 binlog 数据格式不对,导致 debezium 解析异常

错误信息:
ERROR io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Error during binlog processing. Last offset stored = null, binlog reader near position = mysql-bin.000044/211839464. 2023-02-20 21:37:28.480 [blc-172.17.48.3:3306] ERROR io.debezium.pipeline.ErrorHandler [] - Producer failure io.debezium.DebeziumException: Error processing binlog event.
解决方法:
修改 binlog_row_image=full 后需要重启数据库。

6. 是否支持 gh-ost?

支持,不会迁移 Online DDL 变更产生的临时表数据,只迁移源库使用 gh-ost 执行的原始 DDL 数据,同时您可以使用默认的或者自行配置 gh-ost 影子表和无用表的正则表达式。

7. 同步增量数据( changlog 数据)到 DLC 时报错

错误信息:



问题原因:
dlc 的表是 v1表不支持 changlog 数据。
解决方法:
1. 修改 dlc 表为 v2表和开启 upsert 支持。
2. 修改表支持 upsert:ALTER TABLE tblname SET TBLPROPERTIES ('write.upsert.enabled'='true')。
3. 修改表为 v2表:ALTER TABLE tblname SET TBLPROPERTIES ('format-version'='2')。
显示表设置的属性是否成功 show tblproperties tblname。

8. Cannot write incompatible dataset to table with schema

错误详情:
Caused by: java.lang.IllegalArgumentException: Cannot write incompatible dataset to table with schema:
* mobile should be required, but is optional
at org.apache.iceberg.types.TypeUtil.checkSchemaCompatibility(TypeUtil.java:364)
at org.apache.iceberg.types.TypeUtil.validateWriteSchema(TypeUtil.java:323)
错误原因:
用户建 dlc 表时,字段设置了 NOT NULL 约束。
解决办法:
建表时不要设置 not null 约束。

9. 同步 mysql2dlc,报数组越界

问题详情:
java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.flink.table.data.binary.BinarySegmentUtils.getLongMultiSegments(BinarySegmentUtils.java:736) ~[flink-table-blink_2.11-1.13.6.jar:1.13.6]
at org.apache.flink.table.data.binary.BinarySegmentUtils.getLong(BinarySegmentUtils.java:726) ~[flink-table-blink_2.11-1.13.6.jar:1.13.6]
at org.apache.flink.table.data.binary.BinarySegmentUtils.readTimestampData(BinarySegmentUtils.java:1022) ~[flink-table-blink_2.11-1.13.6.jar:1.13.6]
at org.apache.flink.table.data.binary.BinaryRowData.getTimestamp(BinaryRowData.java:356) ~[flink-table-blink_2.11-1.13.6.jar:1.13.6]
at org.apache.flink.table.data.RowData.lambda$createFieldGetter$39385f9c$1(RowData.java:260) ~[flink-table-blink_2.11-1.13.6.jar:1.13.6]
错误原因:
时间字段做主键导致的问题。
解决方法:
1. 不用时间字段做主键。
2. 用户还是需要时间字段保证唯一性,建议用户在 dlc 新增一个冗余字符串字段,将上游的时间字段使用函数转换后映射到冗余字段。

10. DLC 任务报不是一个 iceberg 表

错误信息:



错误原因:
1. 可以让用户在 dlc 执行语句查看表到底是什么类型。
2. 语句:desc formatted 表名。
3. 可以看表类型。
解决办法:
选择正确的引擎建 iceberg 类型的表。

11. flink sql 字段顺序跟 dlc 目标表字段不一致导致报错

解决方法:
不修改任务表字段顺序。