多表实时同步任务
通过多表实时同步功能,你可以将数据库中的数据整库同步到Lakehouse中,包括历史数据的全量同步和变更数据的实时增量同步。多表实时同步功能可达到秒级的端到端时效性,为你提供更好的数据新鲜度。
本文档以相对概要的方式帮助你了解多表同步任务的功能和配置方式。请参考 多表实时同步任务完整指南文档了解更详细的使用指南。
当前支持的数据源范围
多表实时同步当前支持的数据源范围如下。
来源端
- MySQL
- PostgreSQL
- SQL Server
- TiDB
- DM
- Aurora MySQL
- Aurora PostgreSQL
- PolarDB MySQL
- PolarDB PostgreSQL
目标端
- Lakehouse
- Kafka
- MySQL
- PostgreSQL
支持的数据源类型和版本
从增量读取机制上看,当前支持的数据源主要可归入以下两类:
| 类型 | 增量读取模式 | 数据库版本 |
|---|---|---|
| MySQL类 | Binlog | 5.6及以上、8.x |
| PostgreSQL类 | WALs日志 | 14及以上 |
源端数据库准备工作
数据库参数配置
PostgreSQL
注意:修改以下参数需要重启Postgresql Server后生效。
| 配置 | 说明 | 默认值(单位) |
|---|---|---|
| wal_level | 预写日志(WAL)级别,决定多少信息写入到 WAL 中。 replica:会写入足够的数据以支持WAL归档和复制,包括在standby服务器上运行只读查询 minimal:会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录 logical:会增加支持逻辑解码所需的信息 要支持实时同步,需要将wal_level设置为logical | replica |
| max_replication_slots | 服务端允许创建的slot数量。 | 10 |
| max_wal_senders | 服务端最多可同时运行的wal sender进程,对应我们可以同时进行实时同步的任务数。 | 10 |
| max_slot_wal_keep_size | 每个slot保存的wal大小。-1表示无限制。 | -1(MB) |
| wal_sender_timeout | 超过这个配置时间的复制连接会被终端。 | 60000(ms) |
MySQL
| 属性 | 描述 | 要求配置 | 查询方法 |
|---|---|---|---|
| log_bin | 是否开启binlog | ON或on | SHOW GLOBAL VARIABLES LIKE 'log_bin' |
| binlog_format | binlog日志格式。有三种取值可能: statement模式:记录的sql语句,优点是binlog保存内容少,缺点是有时候会导致同步结果不准确,因为同样的sql函数,可能在master和server上执行出不一样的结果,导致同步结果不对 row:记录的是sql执行前后的完整行数据,优点是数据准确,缺点是binlog数据量大 mixed:mysql会根据执行的sql内容自己决定用statement模式还是row模式来保存记录。 | ROW或row | SHOW GLOBAL VARIABLES LIKE 'binlog_format' |
| binlog_row_image | binlog记录前镜像和后镜像的方式 | FULL或full(前镜像和后镜像都记录全部字段) | SHOW GLOBAL VARIABLES LIKE 'binlog_row_image' |
| binlog_expire_logs_seconds | binlog自动清理时间 | 按业务要求配置,建议配置86400(秒)或以上 |
数据库权限配置
同步不同类型数据源的变更事件时,需要在相应数据源服务端配置好适当的权限才能保证数据的正常同步。尽管直接分配一个管理员或超级用户的权限足够保证任务正常运行,但通常会希望能够最小化权限需要分配给同步数据的用户的权限。各操作步骤需要的具体权限配置说明如下。
PostgreSQL
请注意,在执行赋权SQL语句时,确保执行账号自身具备可以授权的权限,建议使用管理员账号。为了确保任务顺利运行,建议将下述所有场景的授权均执行一遍。
场景:配置任务(获取元数据:schema列表、table列表、table字段列表)
所需权限:
授权方式
-
赋予某个角色读取information_schema的权限:
-
赋予某个角色读取某张表的权限:
场景:同步WAL日志
所需权限
授权语句
场景:同步历史全量数据(可选)
所需权限
授权语句
-
赋予某个角色读取某张表的权限:
-
赋予某个角色读取schema下所有表的权限:
场景:变更数据同步,创建publication
所需权限
授权语句
- 赋予CREATE权限
MySQL
请注意,在执行赋权SQL语句时,确保执行账号自身具备GRANT OPTION权限,建议使用超管账号比如root。为了确保任务顺利运行,建议将下述所有场景的授权均执行一遍。
使用场景:配置任务(获取元数据:database列表、table列表、table字段列表)
所需权限
授权语句
-
赋予用户查询 database 列表的权限:
-
赋予用户查询 table 列表和 table 详情的权限(SELECT包含了SHOW TABLES的权限):
使用场景:基于binlog日志同步变更数据
所需权限
授权语句
使用场景:同步历史全量数据
所需权限
授权语句
-
赋予用户查询 table 的权限:
任务创建
操作入口
在任务开发界面,点击新建操作,选择“多表实时同步”任务类型。

主要步骤
创建多表实时同步任务,大致分为四个步骤:
- 配置数据类型,选择从源端什么数据源同步到目标端什么数据源。
- 配置同步任务类型,当前区分为整库镜像实时同步、多表镜像实时同步和多表合并实时同步三种模式。
- 配置需要同步的对象范围,包含来源、目标。
- 配置一些高阶的同步规则,比如对于新增表和字段变更的处理逻辑等。
配置数据类型
配置多表实时同步任务,首先选择需要同步的来源数据和目标端数据的类型。当前支持的来源数据源类型如下:

选择同步模式
目前支持三种任务同步模式,请按需选择:
-
整库镜像:用于将源端所有库表的数据镜像同步到目标端的场景。此种方式以数据库为粒度进行配置,选择的是数据库范围,不需要逐张选择表。库内后续新增表,可由任务自动适配并纳入同步。
-
多表镜像:用于将源端选定的库表数据镜像同步到目标端的场景。此种方式以表粒度进行配置,需要先选库、再选表。后续如果想新增更多表,需要编辑任务、保存并提交,然后重启任务后生效。此模式支持自动感知已纳入同步范围内的字段新增和删除变化。
-
多表合并:用于将源端分库分表的数据合并写入同一张目标表的场景。

多表镜像
来源配置
-
选择数据源
- 对于多表镜像同步,请选择一个数据源。如果这里不展示,请新建一个数据源,详见 数据源配置。
- 请确保数据源中的账号具备足够的权限,详见下文的权限说明。
-
配置读取模式
- MySQL 当前只支持 BINLOG 模式。
- PostgreSQL 当前只支持 WALs 模式。
-
选择同步对象
- 先选择需要同步的库,再选择需要同步的表。
- 页面提供批量配置的功能,基于配置模板,按照格式要求填写配置文件、上传后,页面会按照文件中给定的内容来选中需要同步的对象,选中后可以按需再进行微调。请注意删除模板文件中的注释说明。
-
配置槽位(slot)
- 仅PostgreSQL需要配置,槽位(slot)指PostgreSQL 的 replication slot,详见 说明文档。
- 每个数据库都需要配置一个槽位。目前支持decoderbufs和pgoutput两种插件类型。
- 可以选择已存在的槽位进行使用;或者在页面页面来操作新建,在新建窗口的下方区域的创建语句,可按需修改。点击确定后进行创建。在数据源中配置的用户名必须具备创建slot的权限,否则会创建失败,详见下文的权限说明。
- 特别注意,不同任务不要复用同一个槽位。任务启动时,如果槽位被其它在运行中的任务占用,会启动失败。如果其它任务处在停止状态,因槽位中的数据会被共享消费使用,位点是被共享的,新任务消费的增量数据,同步到目标端的表数据可能会不全。
目标配置
当前支持的目标端数据源包括 Lakehouse、Kafka、MySQL、PostgreSQL。具体可选范围以产品界面为准。
- 目标数据源
- 默认是当前工作空间对应的Lakehouse数据源,不需修改。
- 命名空间规则
- 当前仅支持选择特定的命名空间,后续会扩展支持按照源端进行镜像命名或者自定义命名。
- 按需选择特定命名空间(工作空间)即可。
- 目标表命名规则
- 当前仅支持镜像来源名字,后续会扩展支持添加前缀或者自定义命名规则。
- 计算集群
- 选择工作空间下可用的集群,推荐使用AP类型的集群。
预览配置
- 完成上述源端和目标端配置后,可以预览同步表和字段的映射关系。如果有需要修改,请返回上一步进行调整。
同步规则
-
同步规则中,可以配置Schema Evolution规则,来定义源端表和字段变化后的处理行为,以及选择需要处理的源端变更消息类型等。请按需配置。
-
当前页面可配置的核心规则包括:来源数据删除字段、来源数据新增字段、来源数据删除表、全量同步分组策略、单分组中表个数、单分组中源端最大连接数、处理的变更消息类型、排除字段、排除表。

整库镜像
配置方式和多表镜像基本类似,请参考上文。最大的区别在于选择源端对象时,只选择库,不可以选择具体的表。
如果你的主要诉求是后续库中新增表能够自动进入同步范围,请优先评估是否应该使用整库镜像,而不是多表镜像。
多表合并
来源配置
- 选择数据源
- 同上,多表镜像同步类似
- 配置读取模式
- 同上,多表镜像同步类似
- 选择同步对象
多表合并同步,会使用“虚拟表”作为中间的过度承接,需要在配置时候指定使用什么虚拟表来承接哪些对象的数据。支持两种方式进行配置
- 方式一:基于规则配置,通过正则匹配进行筛选,比如选出以abc开头的所有表,在正则表达式中填写 abc 即可
- 方式二:基于文件批量配置,按照模板中格式要求填写配置文件、上传后,页面会按照文件中给定的内容来选中需要同步的对象,选中后可以按需再进行微调。请注意删除模板文件中的注释说明
目标配置
- 同上,和多表镜像同步类似
预览配置
- 同上,和多表镜像同步类似
同步规则
- 同上,和多表镜像类似
任务高阶参数
在多表实时同步任务的「参数」区域,可以设定一些高阶参数来控制同步任务的资源消耗等。

具体可以设定的高阶参数的名称、含义和默认取值如下。这些参数默认不建议调整,如果有使用需要,建议先联系技术支持人员确认后再进行设定、更改:
| 参数名称 | 参数含义 | 参数取值 |
|---|---|---|
| step1.taskmanager.memory.process.size | 增量同步任务计算进程使用的总内存大小 | 默认值:1600m |
| step1.taskmanager.memory.task.off-heap.size | 增量同步任务计算进程使用的堆外内存大小 | 默认值:256m |
| step2.taskmanager.memory.process.size | 全量同步任务计算进程使用的总内存大小 | 默认值:2000m |
| lh.table.cz.common.output.file.max.size | 全量同步写表时切分出单个文件的大小 | 默认值:33554432 |
| lh.table.cz.common.output.enable.rotate | 全量同步写表时是否切分文件 | 默认值:true |
| pod.limit.memory | 提交同步任务的客户端使用内存上限 | 默认值:1Gi |
提交
点击提交按钮,可将任务提交到生产环境执行。请注意,任务提交后默认不会自动启动,需要手动启动。
任务运维
启动任务
进入任务详情页,可以操作启动任务,请按需选择以下启动方式之一。任务启动后,初始化阶段,根据表的数量不同,可能会消耗几分钟或者更久的时间,请耐心等待。
启动方式
- 无状态启动(仅在任务首次启动才支持):完整同步所有数据,先全量同步,再启动增量同步。
- 从上次保存状态恢复(仅对停止后的任务再次启动支持):如果上次同步被停止,会从停止的位置断点续传。
- 自定义起始位置:从给定的位点进行同步,可以用于数据回刷。对任务中配置的所有表全统一生效。
- MySQL:选择指定文件启动或者指定时间启动。在页面监控区域可以获取到上次文件位置。
- PostgreSQL:指定LSN取值,在下文的实例监控中可以查看到最新的LSN取值。
首次启动后,如果任务已经运行过一次,再次停止后重启,启动弹框默认会选择“从上次保存状态恢复”;“无状态启动”不再可用,但仍可按需选择“自定义起始位置”。
全量同步
- 通过此配置控制在增量同步前,是否先进行全量的数据同步。此配置仅在任务提交上线后的首次启动时可选择。
- 如果首次启动时选择进行全量同步,任务会先完成各表的全量同步,再进入对应表的增量同步阶段。
- 如果首次启动时选择不进行全量同步,任务会直接进入增量同步,不会自动补齐历史存量数据。后续如需补全历史数据,可通过单表重新同步、补数同步,或下线后重新上线的方式处理。
- 最大并发数:如果在启动任务时,选择了先进行全量数据同步,可以通过此参数来控制进行全量数据同步的并发子任务个数。同步任务会建立对应个数的JDBC连接到源端数据库。参数数值越大,理论同步速度会更快(在打满源端负载之前),但对源端的压力也会越大。
实例监控
阶段监控
任务启动后,会经历初始化、全量同步、增量同步三个阶段。可在实例监控区域查看这三个阶段的运行状态。

如果首次启动时选择了全量同步,常见的运行轨迹是:初始化后,单表先显示全量同步完成,再进入增量正在同步;顶层监控也会从全量进度逐步切换到增量运行状态。
指标监控
在指标监控区域,可以查看全量同步和增量同步的关键监控指标。

| 指标名称 | 口径说明 |
|---|---|
| 读取数据 | 数据同步任务在统计周期内从数据源读取的记录数。 |
| 写入数据 | 数据同步任务在统计周期内向目标数据源写入的记录数。 |
| 平均读取速率 | 数据同步任务在统计周期内平均读取速率。(周期内总读取记录/周期时间) |
| 平均写入速率 | 数据同步任务在统计周期内平均写入速率。(周期内总写入记录/周期时间) |
| Failover次数 | 数据同步任务在统计周期内运行发生Failover次数。Failover次数与数据情况和数据同步服务自身运行的稳定性均相关。默认只展示最近10次的Failover信息。 |
同步对象
在同步对象区域,可以查看单表的同步终态和进行对应的运维操作。

在运维页的同步对象区域,建议同时关注两类状态:
- 全量同步状态:用于判断某张表是否还在做全量、是否已经完成全量。
- 增量同步状态:用于判断某张表是否已经进入增量同步、是否处在暂停或停止状态。
如果任务首次启动时选择了全量同步,常见的单表状态变化是先显示“同步完成”,随后增量状态进入“正在同步”;这通常表示该表已经完成历史数据加载,开始持续消费增量变更。相反,如果任务顶层已经是“运行中”,但单表仍长期停留在“暂未启动”或看不到状态推进,就不能仅凭任务状态判断已经启动成功,而应继续结合同步对象详情、操作日志和执行日志确认任务是否真正开始处理数据。
| 指标 | 口径说明 |
|---|---|
| 最新读取位置 | 同步任务实时读取来源对象数据并写入目标表,以目标表最新一条记录的写入时间作为读取位置。 |
| 最新更新时间 | 最近一次写入目标表的时间。 |
| 数据延迟 | 数据从数据源端事务提交到同步至目标端可见的时间间隔。 |
| 操作 | 行为定义 |
|---|---|
| 全量同步详情 | 点击后可跳转全量同步任务界面查看详情 |
| 优先执行 | 在全量同步阶段,通过此操作可以让表的同步优先级提高,优先执行 |
| 取消运行 | 对于正在同步的表可操作,取消当前表的同步 |
| 强制停止 | 对于正在同步的表可操作,强制停止表所在的同步子任务进程。由于有可能多张表在同一个子任务进行中,所以此操作有可能会影响其它表的同步,请务必谨慎操作 |
| 重新同步 | 对该表重新进行全量和增量同步 |
| 查看异常 | 点击后可以查看表的增量同步任务的异常信息,比如Schema Evolution的异常等。 |
| 补数同步 | 针对该表,可以给定过滤条件后进行全量同步,比如按照id取值来筛选出部分的数据 |
操作日志、执行日志与源端表变更记录
运维页里的“操作日志”“执行日志”“源端表变更记录”适合放在一条观察链路里理解:操作日志主要用来确认任务是否已经执行过“创建”“启动”“停止”等动作,以及启动时实际选择的是哪种启动方式;执行日志主要用来确认任务是否真正进入处理阶段,以及查看位点失效、连接异常、反序列化失败、全量子任务失败等具体报错;源端表变更记录则主要用于查看新增表事件,判断系统是否已经识别到新的来源对象。比如,操作日志如果显示最近一次启动方式是“从上次保存状态恢复”,说明任务是在已有位点基础上续传,不会重新走一次首次启动流程;如果执行日志中只有任务启动记录,但同步对象状态长期没有推进,就应继续排查日志中的异常信息;如果任务是整库镜像模式,并且源端新增了一张表,可以先到“源端表变更记录”确认系统是否已经识别到这次新增,而多表镜像模式下即使源端新增了表,这里也可能没有可直接利用的自动纳入结果,此时仍需回到任务配置中手动补加对象。
停止任务
停止任务会停止任务中正在进行的全量同步和增量同步。停止时会自动保存增量同步的位点状态。
- 如果停止时表处在全量同步阶段,重启后,未完全全量同步的表,会重新进行一次全新的全量同步。
- 如果停止时表处在增量同步阶段,重启后,默认会从同步停止的位点继续同步。
下线任务
下线任务属于高危操作,任务下线后,不会保存当前同步的位点。如果再次上线并启动任务,会重新开始同步数据。
- 下线不会清理已经同步到目标端的数据,但会清理中间过程的缓存数据和位点信息。
- 重新同步不会重新建表,全量数据同步会对于老的表进行覆盖写入,增量同步会对目标表做merge into的更新。
已知局限
-
Schema Evolution,支持源端新增字段、删除字段,暂不支持变更字段类型。
-
自动新增表的能力仅适用于整库镜像模式;多表镜像模式不支持自动把新表纳入同步范围,新增表需要编辑任务、保存提交并重启后生效。
-
多表实时同步任务中,源端不同库表中若存在主键相同的数据,同步结果会出现异常。
-
MySQL同步,尚不支持的字段类型:
| 字段类型 | 同步后行为 |
|---|---|
| year | 取值不对应 |
- PostgreSQL同步,尚不支持的字段类型:
| 字段类型 | 同步后行为 |
|---|---|
| varbit | 取值不对应 |
| bytea | 取值不对应 |
| TIMETZ | 取值不对应 |
| interval | 取值不对应 |
| NAME | 取值不对应 |
| NUMERIC | 精度不对应,目标端精度会更高 |
| decimal | 精度不对应,目标端精度会更高 |
