历史版本24 :数据管道-同步源表结构变化 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

 FineDataLink 版本
功能变动
4.0.17支持Mysql 设置同步源表结构变化
4.0.20.1支持SQL Server、Oracle 、GaussDB 200、PostgreSQL、Greenplum、Greenplum(并行装载)作为目标端设置同步源表结构变化
4.0.21Oracle数据源作为来源端,适配同步源表结构变化
4.0.27交互体验优化
4.0.28支持TiDB、Amazon Redshift、SeaboxMPP 作为目标端的DDL
4.0.29支持 PostgreSQL 作为来源端的 DDL
4.1.1支持 SQL Server 作为来源端的 DDL,DDL 逻辑详情参见本文3.3 节表格,且目前 DDL 同步不支持自动同步源端新增字段,若需要使用 DDL 进行新增字段的处理,请参见本文第四章。

1.2 应用场景

在使用管道任务进行数据实时同步过程中,来源端结构可能因业务调整等原因发生变动,如增删表、增删字段、修改字段名称、修改字段类型等,此时,用户希望目标端可以自动同步这些来源端的调整,不需要人为的进行数据表的调整。

1.3 功能说明

数据管道任务支持同步源库DDL功能,开启相关选项后,在源库发生DDL(删除表、新增字段、删除字段、修改字段名称、修改字段类型(长度修改 & 兼容类型修改))时,管道任务可以自动同步这些来源端变化至目标端,不需人为介入修改目标表结构。

2. 支持范围编辑

数据源
来源端目标端
MySQL 支持支持
Oracle 支持
支持
SQL Server 支持支持
GaussDB 200 不支持支持
PostgreSQL 支持支持
Greenplum 包括并行装载不支持支持

kafka不支持不支持(目标端暂不支持kafka)
Doris、StarRocks 不支持不支持
TiDB不支持(来源端暂不支持TiDB)支持
Amazon Redshift不支持(来源端暂不支持Amazon Redshift)支持
SeaboxMPP不支持(来源端暂不支持SeaboxMPP)支持

3. 操作步骤编辑

注:此步骤为非 SQL Server 数据库的 DDL 操作,若需要使用 SQL Server 进行 DDL 则需要对数据库进行操作,详情参见本文第四章。

示例以 MySQL 数据同步至 MySQL 数据库为例。

将 test_1 数据库中的「出入库信息」、「DEMO_PRODUCT」、「CUSTOMER」数据表实时同步至 demotest 数据库中。

DEMO_PRODUCT.xls出入库信息.xlsCUSTOMER.xls

3.1 配置数据管道任务

1)参考:配置数据管道任务 设置数据来源,选择需要同步的数据表,如下图所示:

2)同时在「选择数据去向」时,勾选「同步源表结构变化」按钮,如下图所示:

3)设置表字段的映射关系,修改目标表名并设置主键,如下图所示:

4)设置任务的脏数据阈值、勾选「失败重试」,并选择「消息通知」,勾选「源表结构变化」,并选择通知方式,如下图所示:

此步骤可保证来源端结构因业务调整等原因发生变动,如增删表、增删字段、修改字段名称、修改字段类型后用户可即时被提醒。

3.2 来源端数据变化

在设置管道任务后「出入库信息」表中新增了「状态」字段、修改「种类」字段为「商品种类」、删除了「期初库存」字段,如下图所示:

3.3 目标端同步结果

查看「出入库信息」目标端数据「in_out」,例如「序号」为11的这条数据为数据结构变化后同步的数据,在修改字段后同步的数据中:

  • 新增字段:同步新增字段后续新增的数据(状态字段同步新增数据);

  • 删除字段:被删除字段在后续同步中传NULL值(期初库存字段同步NULL 值);

  • 修改字段名称:原名称字段在后续同步中传NULL值,同步新名称字段的后续新增数据(种类字段修改为商品种类后,种类字段停止同步,商品种类字段继续同步新增数据)。

同时在「表字段映射」中会对修改进行标记,如下图所示:

开启「同步源表结构变化」后,数据结构变化实时同步说明:

操作
「开启」同步源表结构变化
字段映射配置变化
目标表结构变化
目标表数据变化
删除表继续同步其他表。

标记被删除的同步表。

该表对应源表已被删除,该表将不会继续同步。

无变化。被删除表在后续同步中将没有新数据写入。
重命名表

继续同步其他表。



标记原名称表为删除。

该表对应源表已被删除,该表将不会继续同步。

无变化。

原名称表在后续同步中将没有新数据写入。


删除字段

继续同步其他字段。



标记被删除的字段。

对应源字段已被删除,该字段在后续同步中将传NULL值。

无变化。

被删除字段在后续同步中传NULL值。

对于 SQLServer 数据源作为来源端,在检测到字段删除的时刻(每次查询都会比对表结构检测),FDL 就会当做字段已经删除。

此时 CDC 表中可能还存在一部分数据带有这个字段,此时该字段的值将不会同步到目标表中。

新增字段

自动同步新增字段。

同步失败时,记录日志且发送通知,任务正常运行。

对于 SQLServer 数据源作为来源端,目前DDL同步不支持自动同步源端新增字段,若需要进行新增字段 DDL ,需要对数据库进行操作,详情参见本文第四章。


自动在来源端和目标端添加新的映射关系。

同步新增字段。

新增的这个字段不标记物理主键或逻辑主键

同步新增字段的后续新增数据。


修改字段名称

原名称字段删除,新名称字段新增。

对于 SQLServer 数据源作为来源端,不支持修改字段名称。

标记原名称字段删除。

自动在来源端和目标端添加新名称字段的映射关系。

同步新增新名称字段。

原名称字段在后续同步中传NULL值。

同步新名称字段的后续新增数据。

修改字段类型或者长度

自动同步修改字段类型,修改不成功时,记录日志,任务继续运行。修改时的字段映射逻辑和自动建表时一致。

来源表与目标表字段配置自动修改字段类型。同步修改字段类型。历史数据与后续新增数据变化为对应类型数据。

3.4 任务管理

「运行日志」界面会出现 DDL 的更改日志,如下图所示:

4. SQL Server DDL 操作说明编辑

4.1 新增字段

对于SQLServer数据源,目前 DDL 同步不支持自动同步源端新增字段,若需要使用 DDL 进行新增字段的处理,请参见下文提供的方案。

4.1.1 在线方案

注:此方案如果源表在不停写入数据,源表新增字段之后,没有立刻创建新的 CDC 实例,那么在源表新增字段之后到新的 CDC 实例创建前的这段时间中,源表发生的数据修改是不会写入到新的 CDC 实例中的。这可能会导致部分数据丢失新增字段的数据,如果要完全避免这种情况,请采用离线处理方案。

1)源表执行 DDL,新增一个字段。

2)给源表新建一个 Capture Instance

使用命令:

EXEC sys.sp_cdc_enable_table
     @source_schema = N'Schema',
     @source_name = N'Table',
     @role_name = NULL, -- 如果要限制读取角色,可能需要设置
     @capture_instance = N'Schema_Table_newname'; -- 给一个新的名字

注:Table 是数据表的名称(没有 schema )。

3)等待 FineDataLink 检测到新的 Capture Instance 创建后,自动切换到新的 Capture Instance

即可看到目标表中已经同步新增的字段,如下图所示:

4)可以手动把旧的 Capture Instance 删除。

需要先禁用要删除的实例表,示例命令:

-- Disable a Capture Instance for a table
    EXEC sys.sp_cdc_disable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @capture_instance = N'dbo_MyTable'

然后检查change_tables里是否有这条记录,若有的话需要手动删除。

4.1.2 离线处理方案

1)源表停止写入,等待 FineDataLink 同步完源表所有的数据。

2)停止管道任务。

3)源表执行 DDL,新增一个字段:

4)给源表新建一个 Capture Instance

使用命令:

EXEC sys.sp_cdc_enable_table
     @source_schema = N'Schema',
     @source_name = N'Table',
     @role_name = NULL, -- 如果要限制读取角色,可能需要设置
     @capture_instance = N'Schema_Table_newname'; -- 给一个新的名字

5)恢复源表写入。

6)启动管道任务。

7)等待 FineDataLink 检测到新的 Capture Instance 创建后,自动切换到新的 Capture Instance

即可看到目标表中已经同步新增的字段,如下图所示:

8)可以手动删除旧的 Capture Instance。

注:如果没有按照正确顺序操作,可能造成部分有新字段的数据流入了旧的 CDC 实例,那么这部分新字段的数据就丢失了。