sys.sp_cdc_cleanup_change_table (Transact-SQL)
Aplica-se: SQL Server
Remove linhas da tabela de alteração no banco de dados atual com base no valor de @low_water_mark especificado. Esse procedimento armazenado é fornecido para usuários que desejam gerenciar diretamente o processo de limpeza da tabela de alteração. Porém, é necessário ter cuidado, porque o procedimento afeta todos os consumidores de dados na tabela de alteração.
Convenções de sintaxe de Transact-SQL
Sintaxe
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'
O nome da instância de captura associada à tabela de alterações. @capture_instance é sysname, sem padrão, e não pode ser NULL
.
capture_instance deve nomear uma instância de captura que existe no banco de dados atual.
@low_water_mark [ = ] low_water_mark
Um LSN (número de sequência de log) que é usado como a nova marca d'água baixa para o @capture_instance. @low_water_mark é binary(10), sem padrão.
Se o valor não NULL
for , ele deverá aparecer como o start_lsn
valor de uma entrada atual na tabela cdc.lsn_time_mapping . Se outras entradas compartilharem cdc.lsn_time_mapping
o mesmo tempo de confirmação que a entrada identificada pela nova marca d'água baixa, o menor LSN associado a esse grupo de entradas será escolhido como a marca d'água baixa.
Se o valor for definido explicitamente como NULL
, o @low_water_mark atual do @capture_instance será usado para definir o limite superior da operação de limpeza.
Observação
@low_water_mark é o limite LSN. Todas as transações com um valor LSN inferior ao valor fornecido são processadas e o valor em questão é excluído.
@threshold [ = ] 'limite de exclusão'
O número máximo de entradas de exclusão que podem ser excluídas usando uma única instrução na limpeza. @threshold é bigint, com um padrão de 5000.
@fCleanupFailed [ = ] 'falha na limpeza' SAÍDA
Um parâmetro OUTPUT que indica se a operação de limpeza falhou ou não. @fCleanupFailed é bit, com um padrão de 0
.
Conjunto de resultados
Nenhum, a menos que o parâmetro opcional @fCleanupFailed OUTPUT seja usado.
Valores do código de retorno
0
(sucesso) ou 1
(falha).
Exemplos
-- 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
Comentários
sys.sp_cdc_cleanup_change_table
executa as seguintes operações:
Se o parâmetro @low_water_mark for
NULL
, ostart_lsn
valor do @capture_instance permanecerá inalterado. No entanto, se a marca d'água baixa atual for maior que o valor de marca d'água baixa especificado usando o parâmetro @low_water_mark para o procedimento, o Erro 22957 será gerado. A mensagem de erro do erro 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].
Observação
A nova marca d’água baixa pode não ser a marca d’água baixa especificada na chamada do procedimento armazenado. Se outras entradas na tabela compartilharem
cdc.lsn_time_mapping
o mesmo tempo de confirmação, a menorstart_lsn
representada no grupo de entradas será selecionada como a marca d'água baixa ajustada. Se o parâmetro @low_water_mark forNULL
ou a marca d'água baixa atual for maior que a nova marca d'água baixa, ostart_lsn
valor da instância de captura permanecerá inalterado.As entradas da tabela de alteração com
__$start_lsn
valores menores que a marca d'água baixa são excluídas. O limite de exclusão é usado para limitar o número de linhas excluídas em uma única transação. Uma falha ao excluir entradas com êxito é relatada, mas não afeta nenhuma alteração na marca d'água baixa da instância de captura que possa ter sido feita com base na chamada.Se o
sys.sp_cdc_cleanup_change_table
procedimento armazenado atingir o tempo limite após a atualização dastart_lsn
instância de captura, mas sem excluir os dados da tabela de alterações, aumentar o valor de retenção de dados usando o procedimento armazenado sys.sp_cdc_change_job antes da próxima execução do procedimentosys.sp_cdc_cleanup_change_table
armazenado não reterá os dados pelo período de retenção especificado. Ostart_lsn
valor em cdc.change_tables deve ser tratado como a nova marca d'água baixa. Osys.sp_cdc_cleanup_change_table
procedimento armazenado não define ostart_lsn
valor para corresponder ao período de retenção de dados recém-especificado. O procedimento sempre executa a limpeza com base na marca d'água baixa. Especificar um valor para o parâmetro @low_water_mark que seja igual ou superior aostart_lsn
valor em cdc.change_tables evita gerar o Erro 22957.Se você usar
sys.sp_cdc_cleanup_change_table
para gerenciar o processo da tabela de limpeza e ocorrer um deadlock entre a verificação de CDC e a limpeza de CDC quandosys.sp_cdc_cleanup_change_table
for invocado, o Erro 22852 será registrado com severidade 10 (mensagem informativa). A mensagem para o erro 22852 é a seguinte: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.
Utilização sys.sp_cdc_cleanup_change_table
nas seguintes circunstâncias:
O trabalho do Agente de limpeza relata falhas de exclusão.
Um administrador pode executar esse procedimento armazenado explicitamente para tentar novamente a operação com falha. Para repetir a limpeza de uma determinada instância de captura, execute
sys.sp_cdc_cleanup_change_table
e especifiqueNULL
para o parâmetro @low_water_mark .A política simples baseada em retenção usada pelo trabalho do Agente de limpeza não é adequada.
Como esse procedimento armazenado executa a limpeza de uma única instância de captura, ele pode ser usado para criar uma estratégia de limpeza personalizada que adapta as regras de limpeza à instância de captura individual.
Permissões
Requer associação na função de banco de dados fixa db_owner.