sys.sp_cdc_cleanup_change_table (Transact-SQL)

Область применения: 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 является двоичным(10), без значения по умолчанию.

Если значение не NULLравно, оно должно отображаться как start_lsn значение текущей записи в таблице cdc.lsn_time_mapping . Если другие записи в cdc.lsn_time_mapping общей папке совпадают с временем фиксации, что и запись, определяемая новым низким подложкой, то наименьший LSN, связанный с этой группой записей, выбирается как низкий водяной знак.

Если значение явно заданоNULL, текущий @low_water_mark для @capture_instance используется для определения верхней границы операции очистки.

Примечание.

@low_water_mark является пороговым значением LSN. Все транзакции со значением LSN ниже указанного значения обрабатываются, а указанное значение исключается.

[ @threshold = ] 'delete порог'

Максимальное количество записей удаления, которые можно удалить с помощью одной инструкции при очистке. @threshold является bigint, с значением по умолчанию 5000.

[ = ] @fCleanupFailed "очистка завершилась сбоем" ВЫХОДНЫЕ ДАННЫЕ

Параметр 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 выполняет следующие действия.

  1. Если параметр @low_water_mark имеет значениеNULL, start_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 значение для экземпляра записи остается неизменным.

  2. Затем удаляются записи таблицы со значениями __$start_lsn меньше низкого водяного знака. Пороговое значение удаления используется для ограничения количества строк, удаляемых в одной транзакции. Сообщается о неудачном удалении записей, но не влияет на изменение экземпляра записи с низкой водяной знак, который, возможно, был сделан на основе вызова.

  3. Если хранимая sys.sp_cdc_cleanup_change_table процедура истекает после обновления start_lsn экземпляра записи, но без удаления данных таблицы изменений, увеличение значения хранения данных с помощью хранимой процедуры sys.sp_cdc_change_job до следующего выполнения хранимой процедуры sys.sp_cdc_cleanup_change_table не сохраняет данные за указанный период хранения. Значение start_lsn в cdc.change_tables должно рассматриваться как новое низкое водяное знак. Хранимая sys.sp_cdc_cleanup_change_table процедура не задает start_lsn значение, соответствующее только что указанному периоду хранения данных. Процедура всегда выполняет очистку на основе низкой водяной знак. Указание значения для параметра @low_water_mark , равного или выше start_lsn значения в cdc.change_tables, избегает создания ошибки 22957.

  4. Если вы используете 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и укажите NULL для параметра @low_water_mark .

  • Простая политика на основе хранения, используемая заданием агента очистки, не является достаточной.

    Так как эта хранимая процедура выполняет очистку для одного экземпляра записи, ее можно использовать для создания пользовательской стратегии очистки, которая настраивает правила очистки для отдельного экземпляра записи.

Разрешения

Требуется членство в предопределенной роли базы данных db_owner.