sys.sp_cdc_cleanup_change_table (Transact-SQL)

Se aplica a:SQL Server

Quita las filas de la tabla de cambios de la base de datos actual en función del valor de @low_water_mark especificado. Este procedimiento almacenado se proporciona a los usuarios que desean administrar directamente la proceso de limpieza de las tablas de cambios. Sin embargo, se debe utilizar con precaución, porque el procedimiento afecta a todos los consumidores de los datos en la tabla de cambios.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

[ @capture_instance = ] 'capture_instance'

Nombre de la instancia de captura asociada a la tabla de cambios. @capture_instance es sysname, sin valor predeterminado y no puede ser NULL.

capture_instance debe asignar un nombre a una instancia de captura que exista en la base de datos actual.

[ @low_water_mark = ] low_water_mark

Número de secuencia de registro (LSN) que se va a usar como nueva marca de agua baja para la instancia de @capture. @low_water_mark es binary(10), sin valor predeterminado.

Si el valor no es NULL, debe aparecer como el valor start_lsn de una entrada actual en la tabla cdc.lsn_time_mapping . Si otras entradas de cdc.lsn_time_mapping comparten el mismo tiempo de confirmación que la entrada identificada por la nueva marca de agua baja, el LSN más pequeño asociado a ese grupo de entradas se elige como marca de agua baja.

Si el valor se establece explícitamente en NULL, la marca de agua @low actual para la instancia de @capture se usa para definir el límite superior para la operación de limpieza.

[ @threshold = ] 'eliminar umbral'

Número máximo de entradas de eliminación que se pueden eliminar mediante una sola instrucción en la limpieza. @threshold es bigint, con un valor predeterminado de 5000.

[ @fCleanupFailed = ] SALIDA "error de limpieza"

Parámetro OUTPUT que indica si se produjo un error en la operación de limpieza o no. @fCleanupFailed es bit, con un valor predeterminado de 0.

Conjunto de resultados

Ninguno, a menos que se use el parámetro OUTPUT opcional @fCleanupFailed .

Valores de código de retorno

0 (correcto) o 1 (erróneo).

Ejemplos

-- 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

Comentarios

sys.sp_cdc_cleanup_change_table lleva a cabo las operaciones siguientes:

  1. Si el parámetro @low_water_mark es NULL, el valor start_lsn de la instancia de @capture se deja sin cambios. Sin embargo, si la marca de agua baja actual es mayor que el valor de marca de agua inferior especificado mediante el parámetro @low_water_mark para el procedimiento, se produce el error 22957 . El mensaje de error del error 22957 es LSN %s, specified as the new low endpoint for the change table associated with capture instance '%s', isn't within the Change Data Capture timeline [%s, %s].

    Nota:

    El nuevo límite mínimo puede no ser el límite mínimo que se especifica en la llamada al procedimiento almacenado. Si otras entradas de la cdc.lsn_time_mapping tabla comparten el mismo tiempo de confirmación, la start_lsn más pequeña representada en el grupo de entradas se selecciona como la marca de agua baja ajustada. Si el parámetro @low_water_mark es NULL o la marca de agua baja actual es mayor que la nueva marca de agua baja, el start_lsn valor de la instancia de captura se deja sin cambios.

  2. A continuación, se eliminan las entradas de tabla con __$start_lsn valores inferiores a la marca de agua baja. El umbral de eliminación se utiliza para limitar el número de filas eliminadas en una sola transacción. Se notifica un error al eliminar correctamente las entradas, pero no afecta a ningún cambio en la marca de agua baja de la instancia de captura que podría haberse realizado en función de la llamada.

  3. Si el sys.sp_cdc_cleanup_change_table procedimiento almacenado agota el tiempo de espera después de actualizar el start_lsn para la instancia de captura, pero sin eliminar los datos de la tabla de cambios, aumentando el valor de retención de datos mediante el procedimiento almacenado sys.sp_cdc_change_job antes de la siguiente ejecución del procedimiento sys.sp_cdc_cleanup_change_table almacenado no conserva los datos durante el período de retención especificado. El valor de start_lsn en cdc.change_tables debe tratarse como la nueva marca de agua baja. El sys.sp_cdc_cleanup_change_table procedimiento almacenado no establece el valor de start_lsn para que coincida con el período de retención de datos recién especificado. El procedimiento siempre realiza la limpieza en función de la marca de agua baja. Al especificar un valor para el parámetro @low_water_mark que es igual o superior start_lsn al valor de cdc.change_tables, se evita generar el error 22957.

  4. Si usa sys.sp_cdc_cleanup_change_table para administrar el proceso de tabla de limpieza y se produce un interbloqueo entre el examen CDC y la limpieza CDC cuando sys.sp_cdc_cleanup_change_table se invoca, el error 22852 se registra con la gravedad 10 (mensaje informativo). El mensaje del error 22852 es el siguiente:

    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.
    

Use sys.sp_cdc_cleanup_change_table en las siguientes circunstancias:

  • El agente de limpieza notifica errores de eliminación.

    Un administrador puede ejecutar explícitamente este procedimiento almacenado para reintentar una operación que no se ha ejecutado correctamente. Para volver a intentar la limpieza de una instancia de captura determinada, ejecute sys.sp_cdc_cleanup_change_tabley especifique NULL para el parámetro @low_water_mark .

  • La directiva simple basada en retención que usa el trabajo del Agente de limpieza no es adecuada.

    Dado que este procedimiento almacenado realiza la limpieza de una sola instancia de captura, se puede usar para crear una estrategia de limpieza personalizada que adapte las reglas para la limpieza a la instancia de captura individual.

Permisos

Requiere pertenencia al rol fijo de base de datos db_owner.

Consulte también