-
在选择目标端为「已存在表」或者首次进行全量同步时,会对数据进行清空表内容重写,此时
1)当来源表没有主键时,目标表存在主键,进行清表重写时,先清空目标表,再对目标表进行写入;
2)如果此时来源表存在两条主键相同的数据,后一条会覆盖前一条的记录;
自动屏蔽 Oracle 数据源 BLOB、CLOB、NCLOB、LONG、RAW、LONGRAW、BFILE 字段同步
选择管道任务去向后,需要设置来源表和去向表写入数据的字段映射配置。
进入字段映射设置界面,可以设置目标表名称;对来源表同步至目标表的字段映射进行设置。
4.0.23 之前的版本目标数据库数据表物理主键需要不为空,以此保证写入数据的唯一性,同时这样能使目标端拥有索引、提升性能;
但是对于部分列存储的数据库,对设置物理主键有限制,导致无法设置物理主键,比如:当GP使用列存储时、GaussDB(基于GP)使用列存储等,对于无法新建物理主键的这些数据库,在4.0.23 版本支持使用逻辑主键替代物理主键来实现数据实时同步。
注1:逻辑主键需要设置为not null,以保证数据唯一性;
注2:在同步时,优先使用目标端已存在的物理主键,当目标表不存在物理主键时、再使用配置表内的逻辑主键;
当配置任务时,任务中配置了逻辑主键,而用户在某个时间点将目标端新增了物理主键,则在用户查看映射配置时展示目标端的物理主键、而非先前配置的逻辑主键。
自动建表
系统判断目标端数据库支持设置物理主键
不允许目标表物理主键为空
系统判断目标端数据库不支持设置物理主键,仅能设置逻辑主键
不允许目标表逻辑主键为空
系统判断目标端数据库已经存在物理主键
不允许调整物理主键配置
系统判断目标端数据库不存在物理主键
不允许目标端逻辑主键为空
使用「自动建表」,在目标数据库新建管道任务目标表注:新建表不支持和数据库已存在表重命,同时不支持包含中文、特殊字符。
系统自动识别了来源端数据表已有的物理主键,如下图所示:
注:当「选择来源」选择「仅增量同步」时,去向表默认选择「已存在表」,会自动执行一次同名匹配,且用户仍可以手动切换为「自动建表」。
若来源端数据表没有设置逻辑主键,可以手动设置目标表的主键,需要注意的是 设置主键前需要先勾选 Not Null,保证被设置的主键非空,如下图所示:
注:若用户想要使用语句在目标数据库中新建表,可以复制「建表语句」并在数据库执行。
同时可以调整字段映射方式以及目标数据库数据表的字段类型和字段顺序,如下图所示:
选择「已存在表」,可将管道任务数据实时同步至已有数据表,例如目标数据库中已存在s_order数据表,则可以直接选择该数据表,如下图所示:
注:若选择开启「目标端执行逻辑删除」和「同步时标记时间戳」,若目标表不存在新增字段_fdl_update_timestamp、_fdl_marked_deleted,系统将自动在运行任务时帮用户新建该字段。
同时可以调整字段映射方式,重新匹配目标数据库数据表的字段并修改字段顺序,如下图所示:
若需要给同步的数据表批量增加前缀或者后缀,可以点击右上角的「批量修改」,选中需要修改的表,然后增加前后缀即可,如下图所示:
被修改的表名增加了 ods_ 前缀,如下图所示:
当向目标表写入数据时,按照 collapsingMergeTree 表引擎进行写入。
使用 collapsingMergeTree 表引擎,将逻辑主键设置为 order by 字段
注:创建表时,来源表字段不能出现 sign ,会和标识增删改的 sign 字段重名导致同步失败。
当选择已存在表时,只能选择由 collapsingMergeTree 表引擎创建的表,并且要指定 order by 字段,在逻辑主键一列中进行展示。
注:如果能获取表的 order by 字段,则支持设置已存在表为目标表,否则不支持设置为目标表。
clickhouse 作为目标端的写入逻辑为:
对于插入的数据,直接 insert,并标记其 sign 为 1
对于删除的数据,直接insert一条,逻辑主键的数据,并标记其sign为-1 如果是逻辑删除,insert 更新数据、sign 为 1 的数据即可
对于更新的数据, insert 更新数据、sign 为 1 的数据即可。
注:因为 collapsingMergeTree 表的合并不定时,所以使用实时同步的表时,需要在使用前手动触发一次合并,或者在查询 SQL 使用集合方式,计算时去除掉重复数据的影响。
方式一:直接在 SQL 中使用集合方式,集合示例如下所示:
select name, sum(order_amt*sign) as order_amt from default.test_version_collapsing group by name having sum(sign) > 0
方式二:在使用前触发一次合并,「OPTIMIZE TABLE test.ods_real_time_order FINAL」
方式三:直接在查询的 SQL 。select 表名后加 final ,比如 SELECT * FROM gbn_onl_mix.union_order_onl_all_test final WHERE dt = '2023-05-28'。
FineDataLink 管道任务对于 Oracle 数据源,需要开启所有补全级别的日志,参见Oracle环境准备,但是任何级别的补全日志都不补全 LOB 和LONG类型字段,仅当SQL语句中明确设置或更改LOB数据类型的字段值时,Logminer才提供LOB字段的值。
因此FineDataLink 管道任务 Oracle 源表中如果有LOB字段,那么在这些字段没更新时(其他字段有更新操作),解析到的变更数据中将会缺失这些列的数据,导致任务报错,因此对管道任务Oracle数据源下,BLOB、CLOB、NCLOB、LONG、RAW、LONGRAW、BFILE 字段的同步做自动屏蔽处理。
字段映射标识对应字段删除,不支持手动启用并为此类字段配置映射。任务运行时,同步、建表将不包含此字段。
注:仅首次配置表时允许调整字段映射。
详情参见:配置管道任务-管道控制
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
Submitted successfully
Network busy