历史版本34 :数据同步-写入方式 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

FineDataLink版本
功能说明
4.0.181)移除了「比对字段」

2)写入方式「直接将数据写入目标表」,更新为「追加写入数据」

4.0.28
  • 调整「写入方式」和「字段映射」的顺序

  • 写入方式优化,分为三种:直接将数据写入目标表清空目标表,再写入数据基于标识字段,追加/更新/删除数据

4.0.29
  • 主键冲突策略中主键相同,停止写入并报错修改为主键相同,记录为脏数

  • 写入方式为「清空目标表,再写入数据」时逻辑优化

4.1.9.1写入方式基于标识字段,追加/更新/删除数据修改为「基于标识字段,新增/修改/删除数据」
4.2.7.4
  • 新增「事务控制」功能

  • 写入方式选择「清空目标表,再写入数据」时,新增清表方式和主键冲突策略

  • 写入方式选择直接将数据写入目标表」时,主键冲突策略名称更新

4.2.12.2 目标端为 Doris、SelectDB 时,支持「事务控制」功能

1.2 功能简介

本文介绍「数据同步」设置写入方式或者使用「数据转换-DB表输出」设置写入方式时配置项说明。

1.2.1 写入方式

「写入方式」界面如下图所示:

16.png

写入方式有三种:

注:部分数据源支持分区写入。详情请参见:读取、创建、写入分区表

写入方式
说明效果示例
直接将数据写入目标表目标表无物理主键且未配置逻辑主键映射:直接将数据写入目标表不同写入方式效果说明

目标表有物理主键或已配置逻辑主键映射:基于主键比对数据行的差异:主键相同、主键不同

1)主键不同的数据行:追加写入

2)主键相同的数据行,提供三种写入策略:

  • 更新数据:主键相同时更新数据,新数据行覆盖旧数据行

  • 记为脏数据:主键相同时记为脏数据,冲突的数据行不写入

  • 忽略冲突:主键相同时忽略冲突,冲突的数据行不写入

清空目标表,再写入数据

1)提供两种清表方式

  • TRUNCATE:直接清空表数据,速度较快,无数据删除记录

  • DELETE:逐行删除表数据,速度一般,有数据删除记录

2)支持配置主键冲突策略,避免锁表情况

注:目标端为 SelectDB、Doris 时,仅支持 TRUNCATE 清表方式

基于标识字段,新增/修改/删除数据

1)目标表无物理主键:写入方式中勾选了「更新」或「删除」时,「主键映射」处不允许为空,需设置逻辑主键

2)目标表有物理主键或已配置逻辑主键映射,识别数据行的标识:新增、修改、删除:

  • 新增的数据行:新增

  • 修改的数据行:更新

  • 删除的数据行:删除

1.2.2 事务控制

  • 定时任务写入数据库时支持失败回滚,即任务执行失败后不会对目标表产生影响。

  • 定时任务写入数据库时支持前置处理和后置处理,并支持将这些处理逻辑与核心写入操作一起封装为事务,一同支持失败回滚。

1750837674212638.png

2. 写入方式说明编辑

2.1 直接将数据写入目标表

1750839663142990.png

2.1.1 主键映射

建立「来源端-目标端」的数据行对应关系,设置步骤如下图所示:

18.png

1)目标表中若存在物理主键/自动建表配置了主键,将直接根据目标表物理主键,自动生成主键映射行以确定数据唯一性。

2)目标表中若无物理主键:

  • 目标表是自动建表生成的:自动建表时,在「字段映射」处可以手动设定单个或多个字段为物理主键,写入方式Tab中,主键映射处自动显示已设置好的物理主键。

  • 目标表是已存在表:「主键映射」处,支持选择字段作为逻辑主键映射以确定数据唯一性;若不设置逻辑主键,直接追加写入数据。

2.1.2 主键冲突策略

注:目标端为 Hive 时,不支持「主键冲突策略」。

1750839755346161.png

满足以下任一条件,需要选择「主键冲突策略」:

  • 目标表存在物理主键。

  • 目标表不存在物理主键,但配置了逻辑主键。

主键冲突策略有三种:

  • 更新数据:主键相同时更新数据,新数据行覆盖旧数据行。

  • 记为脏数据:主键相同时记为脏数据,冲突的数据行不写入。

  • 忽略冲突:主键相同时忽略冲突,冲突的数据行不写入。

2.2 清空目标表,再写入数据

目标端为简道云时,请参见:简道云输出算子

2.2.1 4.2.7.4 之前版本

1750840016973398.png

直接先把目标表清空掉,然后再写入数据;有无主键均可以选择。

4.0.29 以及之后的版本:

1)当来源表没有主键时,目标表存在主键,进行清表重写时,先清空目标表,再对目标表进行写入;

2)如果此时来源表存在两条主键相同的数据,后一条会覆盖前一条的记录;

2.2.2 4.2.7.4 及之后版本

1750839875769778.png

设置项
说明
清表方式提供两种清表方式

1)TRUNCATE:

  • 优势:直接清空表数据,速度较快

  • 劣势:无法使用事务控制功能,详情请参见本文第三章内容;清表时,若有其他系统读写或者占用这张表,会导致数据库锁表

2)DELETE:

  • 劣势:逐行删除表数据,速度一般

  • 优势:支持使用事务控制功能,详情请参见本文第三章内容

  • 应用场景:清表全写时,期望减少目标库数据的空档期,以及避免清表全写时,清表成功,写数失败

主键映射
  • 当目标表存在物理主键时,则从配置的字段映射中,自动选择物理主键映射键入,且不可修改

  • 若目标表不存在物理主键,则由用户从配置好的字段映射关系中,选择逻辑主键映射

主键冲突策略

当来源表无主键,目标表有主键时,数据写入目标表时依然会存在主键冲突情况,所以需要设置主键冲突策

  • 更新数据:主键相同时更新数据,新数据行覆盖旧数据行

  • 记为脏数据:主键相同时记为脏数据,冲突的数据行不写入

  • 忽略冲突:主键相同时忽略冲突,冲突的数据行不写入

2.3 基于标识字段,新增/修改/删除数据

2.3.1 功能说明

注1:目标端为 Hive 时,不支持该写入方式。

注2:新增/更新/删除可勾选任意一个或多个。

写入方式:

写入方式勾选「删除时,可选择物理删除/逻辑删除:

  • 逻辑删除:不实际删除数据,标记删除数据。

  • 物理删除:实际删除数据。

两种删除方式的具体效果可参见:物理删除和逻辑删除的区别

标识字段/标识值:

1)通过标识字段和标识值筛选出需要新增/更新/删除的数据。

2)若使用「数据比对+DB表输出算子」实现数据的处理,「DB表输出算子中的标识字段则自动读取 fdl_comparison_type 作为标识字段,且自动读取标识字段的值作为标识值。

3)表输出只选择新增/更新/删除其中一个时,「标识字段」可不填,不填则对读取的所有数据进行新增或更新或删除。

主键映射:

详情请参考本文 2.1 节说明。

1)出现条件:写入方式中勾选了「更新」或「删除」。

2)写入方式中勾选了「更新」或「删除」时,「主键映射」处不允许为空。

2.3.2 最佳实践

1)通常数据比对+DB 表输出结合使用,实现数据的增删改;详情参见:数据比对典型示例

2)单个数据同步节点使用场景:

  • 用户希望将筛选出的数据,只做新增/更新/删除操作。

  • 用户数据已经有了标识字段和标识值,需要对数据进行新增/更新/删除操作。

详情请参见:数据同步-基于标识字段,新增/更新/删除数据

3. 事务控制编辑

3.1 应用场景

1)用户在定时同步向目标库写入数据时,希望可以将单次当前来源端的所有数据,放到同一个事务内装载:

  • 要么都成功,正常提交事务,更改目标表数据。

  • 要么都失败,事务回滚,对目标表不产生影响。

2)在定时任务同步完成后,可以将当次写入的统计数据写到自定义的表中,以方便后续校验数据。

3.2 使用限制

1)支持使用「事务控制」的数据源:

版本
新增支持的数据源
4.2.7.4 - 4.2.8.1目标端为 Oracle、Greenplum、MySQL、SQL Server、PostgreSQL
4.2.8.2 - 4.2.12.1目标端为 KingBaseES(SqlServer模式)、KingBaseES(MySQL模式)
4.2.12.2 及之后版本目标端为 Doris、SelectDB

2)当写入方式选择「清空目标表,再写入数据」时:

  • 清表方式为 TRUNCATE 时,只有 PostgreSQL、Greenplum 支持使用事务控制」功能。

  • 清表方式为 DELETE 时,支持事务控制的数据库,均支持开启「写入事务控制」。(Doris、SelectDB 本身并不支持 DELETE 清表方式)

3)Doris、SelectDB 的事务控制仅支持 INSERT INTO SELECT、UPDATE、DELETE 语句,因此开启「事务控制」功能后,自定义前/后置 SQL 执行其他语句会报错。

3.3 功能说明

定时任务写入数据库时支持前置处理和后置处理,并支持将这些处理逻辑与核心写入操作一起封装为事务,一同支持失败回滚。界面如下图所示:

18.png

事务控制配置项如下所示:

若来源端选择了并行取数 ,去向端开启「事务控制,默认进行并行取数。

事务控制功能示例请参见:事务控制示例

功能
说明
前置 SQL 

1)应用场景:删除目标表中XX时间段内的数据,删除后,再进行写入

2)支持使用「@temp_tbl_nm_full」引用装载时使用的中间表名,可以使用此参数定义SQL查询,其他事务中引用此表名参数时,值为空字符串

后置 SQL 

1)应用场景:使用「后置SQL」做装载后检查,检查最终结果是否有异常;或者来记录增量时间戳,还可以用来统计表中的总/新增数据量,以及记录 etl 完成时间

2)支持使用「@temp_tbl_nm_full」引用装载时使用的中间表名,可以使用此参数定义SQL查询,其他事务中引用此表名参数时,值为空字符串

主键冲突策略

开启「事务控制」按钮后,或者目标端为 Gbase 8A 时,主键冲突策略只能选择:

  • 更新数据:主键相同时更新数据,新数据行覆盖旧数据行

  • 运行报错:主键相同时节点报错,冲突的数据行不写入

支持使用的参数:

参数说明
@temp_tbl_nm_full带有引号和完整SCHEMA的中间表名
@temp_schema_nm无引号的中间SCHEMA名
@temp_tbl_nm 无引号的中间表名
@target_tbl_nm_full 带有引号和完整SCHEMA的目标表名
@target_schema_nm无引号的目标SCHEMA名
@target_tbl_nm 无引号的目标表名

4. 注意事项编辑

比如来源表和目标表都有 D 列的部分数据为 NULL:

设置「写入方式」为追加写入且 A、B、C、D 都是逻辑主键,如下图所示:

运行后:若 D 列不为 NULL,若主键冲突则覆盖目标表数据;若 D 列为 NULL,若主键冲突则不会遵循覆盖逻辑,会追加写入。