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 ningún 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 usa como nueva marca de agua baja para la @capture_instance. @low_water_mark es binary(10), sin valor predeterminado.
Si el valor no NULL
es , debe aparecer como el start_lsn
valor 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 NULL
explícitamente en , el @low_water_mark actual de la @capture_instance se usa para definir el límite superior para la operación de limpieza.
Nota:
@low_water_mark es el umbral de LSN. Se procesan todas las transacciones con un valor LSN inferior al valor proporcionado y se excluye el valor en cuestión.
[ @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:
Si el parámetro @low_water_mark es
NULL
, elstart_lsn
valor del @capture_instance 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 esLSN %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].
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, se selecciona el menorstart_lsn
representado en el grupo de entradas como marca de agua baja ajustada. Si el parámetro @low_water_mark esNULL
o la marca de agua baja actual es mayor que la nueva marca de agua baja, elstart_lsn
valor de la instancia de captura se deja sin cambios.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.Si el procedimiento almacenado agota el
sys.sp_cdc_cleanup_change_table
tiempo de espera después de actualizar parastart_lsn
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 procedimientosys.sp_cdc_cleanup_change_table
almacenado no conserva los datos durante el período de retención especificado. Elstart_lsn
valor de cdc.change_tables debe tratarse como la nueva marca de agua baja. Elsys.sp_cdc_cleanup_change_table
procedimiento almacenado no establece elstart_lsn
valor 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 superiorstart_lsn
al valor de cdc.change_tables, se evita generar el error 22957.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 cuandosys.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_table
y especifiqueNULL
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.