1. 概述
SQL Server 数据源作为管道任务来源端时,目前 DDL 同步功能 不支持自动同步源端新增字段,若需要使用 DDL 进行新增字段的处理,请参见本文提供的方案。
2. 方案一:在线方案
注:此方案如果源表在不停写入数据,源表新增字段之后,没有立刻创建新的 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 删除。
检查 change_tables 中旧的 Capture Instance 名称:
USE database;
GO
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
然后禁用该 Capture Instance ,示例命令:
-- Disable a Capture Instance for a table
EXEC sys.sp_cdc_disable_table
@source_schema = N'Schema',
@source_name = N'Table',
@capture_instance = N'Schema_Table'
注:Table 是数据表的名称(没有 schema );Schema_Table 为需要删除的旧 Capture Instance 。
然后使用如下命令检查 change_tables 里是否有这条记录,若没有则表示已经被删除,若有的话需要手动使用 SQL 命令删除。
USE database;
GO
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
3. 方案二:离线处理方案
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 实例,那么这部分新字段的数据就丢失了。