sys.sp_cdc_cleanup_change_table (Transact-SQL)

Aplica-se a:SQL Server

Remove linhas da tabela de alterações 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 número de sequência de log (LSN) que deve ser usado como a nova marca d'água baixa para a instância @capture. @low_water_mark é binary(10), sem padrão.

Se o valor não for nulo, ele deverá aparecer como o valor start_lsn 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 marca d'água baixa.

Se o valor for explicitamente definido como NULL, a marca d'água @low atual para a instância @capture será usada para definir o limite superior para a operação de limpeza.

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

  1. Se o parâmetro @low_water_mark for NULL, o valor start_lsn para a instância @capture será mantido 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á lançado. A mensagem de erro para o erro 22957 é 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].

    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 menor start_lsn representada no grupo de entradas será selecionada como a marca d'água baixa ajustada. Se o parâmetro @low_water_mark for NULL ou a marca d'água baixa atual for maior que a nova marca d'água baixa, o start_lsn valor da instância de captura será mantido inalterado.

  2. As entradas de 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.

  3. Se o procedimento armazenado atingir o tempo limite após a atualização do start_lsn para a 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 procedimento sys.sp_cdc_cleanup_change_table armazenado não reterá os dados para o sys.sp_cdc_cleanup_change_table período de retenção especificado. O valor start_lsn em cdc.change_tables deve ser tratado como a nova marca d'água baixa. O sys.sp_cdc_cleanup_change_table procedimento armazenado não define o valor start_lsn para corresponder ao período de retenção de dados recém-especificado. O procedimento sempre realiza a limpeza com base na marca d'água baixa. Especificar um valor para o parâmetro @low_water_mark que é igual ou maior que o start_lsn valor em cdc.change_tables, evita a geração de erro 22957.

  4. 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 CDC e a limpeza CDC quando sys.sp_cdc_cleanup_change_table for invocado, o Erro 22852 será registrado com a 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 tentar novamente a limpeza de uma determinada instância de captura, execute sys.sp_cdc_cleanup_change_tablee especifique NULL 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 para 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.