适用于:SQL Server
Azure 数据工厂中的 SSIS 集成运行时
重要
已弃用 CDC 流组件(包括 CDC 控制任务、CDC 源和 CDC 拆分器)。 有关详细信息,请参阅公告。
CDC 控制任务用于控制变更数据捕获 (CDC) 包的生命周期。 它负责 CDC 包与初始加载包之间的同步,以及对一次 CDC 包运行中处理的日志序列号 (LSN) 范围进行管理。 此外,CDC 控制任务还处理错误情况和恢复。
CDC 控制任务在 SSIS 包变量中维护 CDC 包的状态,并且还可以将其保存在某一数据库表中,以便跨多个包激活和在一起执行某一公共 CDC 进程的多个包之间(例如,一个任务可负责初始加载,而另一个任务则用于滴送处理更新)维护该状态。
CDC 控制任务支持两组操作。 一组负责初始加载和变更处理的同步,另一组负责管理 CDC 包一次运行中 LSN 的变更处理范围,并跟踪哪些内容已成功处理。
下列操作处理初始加载和更改处理的同步:
| Operation | 说明 |
|---|---|
| ResetCdcState | 此操作用于重置与当前 CDC 上下文相关联的持久的 CDC 状态。 在此操作运行后,来自 LSN-timestamp sys.fn_cdc_get_max_lsn 表的当前最大 LSN 将成为下一处理范围的起始范围。 此操作要求到源数据库的连接。 |
| MarkInitialLoadStart | 此操作用于初始加载包的开头,以便在初始加载包开始读取源表之前记录源数据库中的当前 LSN。 此操作要求到源数据库的连接以便调用 sys.fn_cdc_get_max_lsn。如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择 MarkInitialLoadStart,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。 |
| MarkInitialLoadEnd | 此操作用于初始加载包的末尾,以便在初始加载包完成读取源表之后记录源数据库中的当前 LSN。 此 LSN 通过以下方式确定:首先记录此操作发生时的当前时间,然后在 CDC 数据库的 cdc.lsn_time_mapping 表中进行查询以便查找在该时间后发生的更改。如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择 MarkInitialLoadEnd,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。 |
| MarkCdcStart | 在从快照数据库生成初始加载时使用此操作。 在此情况下,更改处理应在快照 LSN 后立即开始。 您可以指定要使用的快照数据库的名称并且 CDC 控制任务将查询 SQL Server 以找到快照 LSN。 您还可以选择直接指定快照 LSN。 如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择 MarkCdcStart,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。 |
下列操作用于管理处理范围:
| Operation | 说明 |
|---|---|
| GetProcessingRange | 在调用使用 CDC 源数据流的数据流之前使用此操作。 此操作定义了 CDC 源数据流在调用时读取的 LSN 范围。 该范围存储于一个 SSIS 包变量中,在数据流处理期间 CDC 源将使用该变量。 有关存储的状态的详细信息,请参阅 定义状态变量。 |
| MarkProcessedRange | 此操作在每次 CDC 运行后执行(即在 CDC 数据流成功完成后),用于记录该次 CDC 运行中已被完全处理的最后一个 LSN。 下一次执行 GetProcessingRange 时,此位置将是处理范围的起始位置。 |
处理 CDC 状态持久化
CDC 控制任务在每次激活之间保持持久状态。 在 CDC 状态中存储的信息用于确定和维护 CDC 包的处理范围以及用于检测到错误条件。 该持久性状态以字符串的形式存储。 有关详细信息,请参阅 定义状态变量。
CDC 控制任务支持两种类型的状态持久性
手动状态持久性:在此情况中,该 CDC 控制任务管理在某个包变量中存储的状态,但包开发人员必须在调用 CDC 控制前从持久性状态中读取该变量,然后在最后调用 CDC 控制并且 CDC 运行完成后将该变量写回到该持久性存储区中。
自动状态持久性:CDC 状态存储在数据库中的表中。 该状态根据在 “要用于存储状态的表” 属性中命名的表中的 StateName 属性提供的名称存储,该表位于用于存储状态的所选连接管理器中。 默认管理器是源连接管理器,但通常的做法是使其成为目标连接管理器。 该 CDC 控制任务更新状态表中的状态值,并且该值作为环境事务的一部分提交。
错误处理
在以下情况下,CDC 控制任务可能会报告错误:
它无法读取持久 CDC 状态,或者更新持久状态时失败。
它无法从源数据库读取当前 LSN 信息。
读取的 CDC 状态不一致。
在所有这些情况下,CDC Control 任务都会报告一个错误,并且该错误可以按照 SSIS 处理控制流错误的标准方式进行处理。
在未调用标记处理的范围的情况下在另一个获取处理范围操作后直接调用获取处理范围操作时,该 CDC 控制任务还可能会报告一个警告。 这指示以前的运行失败或其他 CDC 包可能正在使用相同的 CDC 状态名称运行。
配置 CDC 控制任务
可以通过 SSIS 设计器或以编程方式来设置属性。
本节内容
相关任务
CDC 控制任务编辑器
使用 “CDC 控制任务编辑器” 对话框可以配置 CDC 控制任务。 CDC 控制任务配置包括定义与 CDC 数据库的连接、CDC 任务操作和状态管理信息。
若要了解有关 CDC 控制任务的详细信息,请参阅 CDC Control Task。
打开“CDC 控制任务编辑器”
在 SQL Server Data Tools中,打开包含 CDC 控制任务的 SQL Server 2019 Integration Services (SSIS) 包。
在控制流选项卡上,双击 CDC Control 任务。
选项
SQL Server CDC 数据库 ADO.NET 连接管理器
从列表中选择现有连接管理器,或单击“新建” 创建新的连接。 该连接必须连接到已启用 CDC 且包含所选更改表的 SQL Server 数据库。
CDC 控制操作
选择要为此任务运行的操作。 所有操作都使用存储在 SSIS 包变量中的状态变量,包变量存储状态并在包的不同组件之间传递该状态。
标记初始加载开始:在从不具有快照的活动数据库执行初始加载时使用此操作。 在初始加载包的开头调用此操作,以便在初始加载包开始读取源表之前记录源数据库中的当前 LSN。 此操作要求连接到源数据库。
如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择“标记初始加载开始”,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。
标记初始加载结束:在从不具有快照的活动数据库执行初始加载时使用此操作。 在初始加载包的末尾调用此操作,以便在初始加载包完成读取源表之后记录源数据库中的当前 LSN。 此 LSN 是通过记录此操作发生的当前时间,然后在 CDC 数据库中查询
cdc.lsn_time_映射表来查找在该时间之后发生的更改来确定的如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择“标记初始加载结束”,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。
标记 CDC 开始:当初始加载来自快照数据库或静止数据库时,应使用此操作。 在初始加载包内的任何一点都可以调用该操作。 该操作接受一个参数,该参数可以是快照 LSN,也可以是快照数据库的名称(系统将自动从中派生快照 LSN),或者留空;在这种情况下,将使用当前数据库的 LSN 作为更改处理包的起始 LSN。
此操作用于替代“标记初始加载开始/结束”操作。
如果在 SQL Server CDC(也就是说,不是 Oracle)上工作时选择“标记 CDC 开始”,则在连接管理器中指定的用户必须是 db_owner 或 sysadmin。
获取处理范围:在调用使用 CDC 源数据流的数据流之前,在更改处理包中使用此操作。 此操作定义了 CDC 源数据流在调用时读取的 LSN 范围。 该范围存储于一个 SSIS 包变量中,在数据流处理期间 CDC 源将使用该变量。
有关存储的可能的 CDC 状态的详细信息,请参阅 定义状态变量。
标记已处理范围:此操作用于更改处理包中,在 CDC 运行结束时(即 CDC 数据流成功完成后)记录该次 CDC 运行中已完全处理的最后一个 LSN。 下一次执行
GetProcessingRange时,此位置确定下一处理范围的起点。重置 CDC 状态:此操作用于重置与当前 CDC 上下文相关联的持久 CDC 状态。 在此操作运行后,来自 LSN-timestamp
sys.fn_cdc_get_max_lsn表的当前最大 LSN 将成为下一处理范围的起始范围。 此操作要求到源数据库的连接。举例来说,当您只需处理新创建的更改记录而忽略所有旧的更改记录时,就需要使用此操作。
包含 CDC 状态的变量
选择存储任务操作的状态信息的 SSIS 包变量。 在开始之前,应该先定义一个变量。 如果您选择 “自动状态持久性”,将自动加载和保存状态变量。
有关定义状态变量的详细信息,请参阅 定义状态变量。
用于启动 CDC 的 SQL Server LSN/快照名称:
键入自其开始执行初始加载的当前源数据库 LSN 或快照数据库的名称,以确定 CDC 的起点。 仅当 “CDC 控制操作” 设置为 “标记 CDC 开始”时,此选项才可用。
有关这些操作的详细信息,请参阅 CDC Control Task。
在数据库表中自动存储状态
选中此复选框后,CDC 控制任务可以在指定数据库所包含的状态表中自动加载和存储 CDC 状态。 若未选中此选项,开发人员必须在包开始执行时加载 CDC 状态,并且只要 CDC 状态发生更改就要保存该状态。
存储状态的数据库的连接管理器
从列表中选择现有 ADO.NET 连接管理器,或单击“新建”创建新的连接。 此连接指向包含状态表的 SQL Server 数据库。 状态表包含状态信息。
仅当选定 “自动状态持久性” 时此选项才可用,并且这是一个必需的参数。
用于存储状态的表
键入要用于存储 CDC 状态的状态表的名称。 指定的表必须具有名为 name 和 state 的两列,并且这两列的数据类型必须为 varchar (256)。
您还可以选择 新建,以获取用于创建包含所需列的新 State 表的 SQL 脚本。 如果选择 “自动状态持久性” ,开发人员必须根据上面列出的要求创建一个状态表。
仅当选定 “自动状态持久性” 时此选项才可用,并且这是一个必需的参数。
状态名称
键入与持久 CDC 状态关联的名称。 使用相同 CDC 上下文的完整负载和 CDC 包将指定一个公共的状态名称。 此名称用于查找状态表中的状态行。