捕获作业

捕获作业可通过运行无参数存储过程 sp_MScdc_capture_job 来启动。此存储过程启动时,将从 msdb.dbo.cdc_jobs 中为捕获作业提取 maxtrans、maxscans、continuous 和 pollinginterval 的配置值。然后,这些配置值会作为参数传递到存储过程 sp_cdc_scan。该存储过程用于调用 sp_replcmds 以执行日志扫描。

捕获作业参数

若要了解捕获作业行为,必须了解 sp_cdc_scan 使用可配置参数的方式。

maxtrans 参数

maxtrans 参数用于指定能够在日志的单个扫描循环中处理的最大事务数。如果在该扫描期间要处理的事务数达到该限制,则当前扫描中将不包括任何其他事务。一个扫描循环完成后,已处理的事务数将始终小于或等于 maxtrans。

maxscans 参数

maxscans 参数用于指定在返回 (continuous = 0) 或执行 waitfor (continuous = 1) 之前为完成日志扫描可以尝试的最大扫描循环次数。

continous 参数

continuous 参数用于控制在完成日志扫描或执行的扫描循环达到最大次数之后,sp_cdc_scan 是否放弃控制(单次触发模式)。它还控制在显式停止 sp_cdc_scan 之前此存储过程是否继续运行(继续模式)。

单次触发模式

在单次触发模式中,捕获作业请求 sp_cdc_scan 执行最多 maxtrans 次扫描以尝试全部扫描完日志,然后返回。日志中存在的超出 maxtrans 数量的任何事务将在稍后的扫描中处理。

单次触发模式用于待处理事务量已知的受控测试中,优点是作业完成后将自动关闭。建议不要将单次触发模式用于生产。这是因为它依赖于作业计划来管理扫描循环的运行频率。

以单次触发模式运行时,您可以计算捕获作业的预期吞吐量的上限并以每秒的事务数来表示。其计算方法如下:

(maxtrans * maxscans) / number of seconds between scans

即使扫描日志和填充更改表所需的时间与 0 相差不多,作业的平均吞吐量也不能超过以如下方式所获得的值:即将单次扫描所允许的最大事务数乘以允许的最大扫描次数后除以日志处理间隔的秒数。

如果将单次触发模式用于控制日志扫描,则日志处理间隔的秒数将不得不受作业计划的控制。如果需要采用这种方式,则以连续模式运行捕获作业是一种管理重新计划日志扫描的更好方式。

连续模式和轮询间隔

在连续模式下,捕获作业将请求 sp_cdc_scan 连续运行。这使得存储过程可通过提供 maxtrans 和 maxscans 值以及日志处理间隔(轮询间隔)的秒数值来管理自己的等待循环。在该模式下运行,捕获作业会保持活动状态,并在日志扫描间隔内执行 WAITFOR。

注意注意

如果轮询间隔的值大于 0,则重复执行单次触发作业的吞吐量的同一上限也适用于连续模式下的作业操作。也就是说,将 (maxtrans * maxscans) 除以非零轮询间隔即可得到捕获作业可以处理的平均事务数的上限。

捕获作业自定义

对于捕获作业,可以应用其他逻辑来确定是立即开始新扫描,还是在启动新扫描之前强制休眠,而非依赖于固定的轮询间隔。该选择可以仅基于一天中的某个时间,可以在峰值活动期间强制长时间休眠,甚至可以在一天即将结束时(此时为完成白天处理并为夜间运行做准备的关键时刻)将轮询间隔改为 0。也可以监视捕获进程进度,以确定何时已对午夜提交的所有事务进行扫描并将其存放在更改表中。这将导致捕获作业结束,该作业可由计划的每日重启来重新启动。通过将调用 sp_cdc_scan 的传递作业步骤替换为对 sp_cdc_scan 的用户编写包装的调用,只需少量的额外操作即可获得高度自定义的行为。

请参阅

概念