相关文章推荐

適用於: 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_instance是 sysname,沒有預設值,而且不能是 NULL

capture_instance必須命名存在於目前資料庫中的擷取實例。

[ @low_water_mark = ] low_water_mark

記錄序號 (LSN),作為@capture_instance的新低水位線@low_water_mark為 binary(10),沒有預設值。

如果值不是 NULL,它必須顯示為start_lsncdc.lsn_time_mapping數據表中目前專案的值。 如果中 cdc.lsn_time_mapping 其他專案與新低水位線所識別的專案相同認可時間,則會選擇與該專案群組相關聯的最小 LSN 做為低水位線。

如果值明確設定為 NULL,則會使用@capture_instance的目前@low_water_mark來定義清除作業的上限。

@low_water_mark是 LSN 閾值。 處理低於所提供值的任何 LSN 值交易,並排除有問題的值。

[ @threshold = ] 'delete threshold'

清除時可以使用單一語句刪除的最大刪除項目數目。 @threshold為 bigint,預設值為 5000。

[ @fCleanupFailed = ] 'cleanup failed' OUTPUT

指出清除作業是否失敗的 OUTPUT 參數。 @fCleanupFailed為 bit,預設值為 0

除非使用選擇性 @fCleanupFailed OUTPUT 參數,否則為 None。

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參數為 NULLstart_lsn則@capture_instance的值會保持不變。 不過,如果目前的低水位線大於使用 程式@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_cleanup_change_table程式sys.sp_cdc_change_job增加數據保留值,並不會保留指定保留期間的數據。 start_lsncdc.change_tables中的值應該視為新的低水位線。 預 sys.sp_cdc_cleanup_change_table 存程式不會設定 start_lsn 值以符合新指定的數據保留期間。 此程式一律會根據低水位線執行清除。 為等於或高於start_lsncdc.change_tables之@low_water_mark參數指定值,可避免產生錯誤 22957。

  • 如果您使用 sys.sp_cdc_cleanup_change_table 來管理清除資料表進程,並在叫用 CDC 掃描和 CDC 清除 sys.sp_cdc_cleanup_change_table 之間發生死結, 錯誤 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)
  •  
    推荐文章