适用于: SQL Server

根据指定的 @low_water_mark 值从当前数据库中的更改表中删除行。 此存储过程是为需要直接管理更改表清除进程的用户提供的。 但是,由于此过程会影响更改表中数据的所有使用者,因而应多加小心。

Transact-SQL 语法约定

sys.sp_cdc_cleanup_change_table [ @capture_instance = ] 'capture_instance'
    , [ @low_water_mark = ] low_water_mark
    , [ @threshold = ] 'delete threshold'
    , [ @fCleanupFailed = ] 'cleanup failed' OUTPUT
[ ; ]

[ @capture_instance = ] 'capture_instance'

与更改表关联的捕获实例的名称。 @capture_instancesysname,没有默认值,不能为 NULL。

capture_instance 必须命名当前数据库中存在的捕获实例。

[ @low_water_mark = ] low_water_mark

日志序列号 (LSN) 用作 @capture实例的新低水印。 @low_water_mark二进制 (10) ,没有默认值。

如果该值为非 null,则它必须显示为cdc.lsn_time_mapping表中当前条目的 start_lsn 值。 如果 中的其他 cdc.lsn_time_mapping 条目与新的低水印标识的条目具有相同的提交时间,则会选择与该条目组关联的最小 LSN 作为低水印。

如果该值显式设置为 NULL,则使用@capture实例的当前@low水印来定义清理操作的上限。

[ @threshold = ] 'delete threshold'

在清理时使用单个语句可以删除的最大删除条目数。 @thresholdbigint,默认值为 5000。

[ @fCleanupFailed = ] 'cleanup failed' OUTPUT

指示清理操作是否失败的 OUTPUT 参数。 @fCleanupFailed,默认值为 0

无,除非使用可选的 @fCleanupFailed OUTPUT 参数。

返回代码值

0 (成功) 或 1 (失败) 。

-- Declaring a variable and Setting to zero first
SELECT @cleanup_failed_bit = 0;
-- Execute cleanup and obtain output bit
EXEC @retcode = sys.sp_cdc_cleanup_change_table
    @capture_instance = '<CaptureInstance>',
    @low_water_mark = @LSN, --== LSN to be used for new low watermark for capture instance
    @threshold = 1,
    @fCleanupFailed = @cleanup_failed_bit OUTPUT;
-- Leverage @cleanup_failed_bit output to check the status.
SELECT IIF(@cleanup_failed_bit > 0, 'CLEANUP FAILURE', 'CLEANUP SUCCESS');
CLEANUP SUCCESS

sys.sp_cdc_cleanup_change_table 执行以下操作:

  • 如果 @low_water_mark 参数为 NULL,则 @capture实例的start_lsn 值保持不变。 但是,如果当前低水印大于使用过程 @low_water_mark 参数指定的低水印值,则会引发 错误 22957 。 错误 22957 的错误消息为 LSN %s, specified as the new low endpoint for the change table associated with capture instance '%s', is not within the Change Data Capture timeline [%s, %s].

    新的低水印可能不是在存储过程调用中指定的低水印。 如果表中的其他条目 cdc.lsn_time_mapping 共享相同的提交时间,则会选择在条目组中表示的最小start_lsn作为调整后的低水印。 如果 @low_water_mark 参数为 NULL 或当前低水印大于新的低水印,则 start_lsn 捕获实例的值保持不变。

  • 然后删除值小于低水印的更改表条目 __$start_lsn 。 删除阈值用于限制在单个事务中删除的行数。 报告成功删除条目失败,但不会影响对捕获实例所做的任何更改,该更改可能已基于调用进行。

  • 如果存储过程在 sys.sp_cdc_cleanup_change_table 更新捕获实例的start_lsn后超时,但没有删除更改表数据,则使用存储过程 sys.sp_cdc_change_job 在存储过程下次执行 sys.sp_cdc_cleanup_change_table 之前增加数据保留值不会在指定的保留期内保留数据。 cdc.change_tables 中的 start_lsn 值应被视为新的低水印。 sys.sp_cdc_cleanup_change_table存储过程不会设置start_lsn值以匹配新指定的数据保持期。 该过程始终基于低水印执行清理。 为 @low_water_mark 参数指定一个等于或高于 start_lsncdc.change_tables 中的值的值可避免生成错误 22957。

  • 如果使用 sys.sp_cdc_cleanup_change_table 来管理清理表进程,并且调用 时 sys.sp_cdc_cleanup_change_table CDC 扫描和 CDC 清理之间发生死锁,则会记录 错误 22852 ,严重性为 10 (信息性消息) 。 错误 22852 的消息如下所示:

    Could not delete change table entries made obsolete by a change in one or more low water marks for capture instances of database <DatabaseName>. The failure occurred when executing the command <CommandName>. The error returned was <ErrorInfo>. Use the action and error to determine the cause of the failure and resubmit the request.
    

    在以下情况下使用 sys.sp_cdc_cleanup_change_table

  • 清理代理作业报告删除失败。

    管理员可以运行此存储过程以显式重试失败的操作。 若要重试给定捕获实例的清理,请执行 sys.sp_cdc_cleanup_change_table,并为 @low_water_mark 参数指定 NULL。

  • 清理代理作业使用的基于保留期的简单策略是不够的。

    由于此存储过程对单个捕获实例执行清理,因此可用于生成自定义清理策略,该策略根据单个捕获实例定制清理规则。

    要求具有 db_owner 固定数据库角色中的成员资格。

  • cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)
  • sys.fn_cdc_get_min_lsn (Transact-SQL)
  • sys.fn_cdc_increment_lsn (Transact-SQL)
  •