sys.sp_cdc_cleanup_change_table (Transact-SQL)

Aplica-se a: SQL Server

Remove linhas da tabela de alterações na base de dados atual com base no valor de @low_water_mark especificado. Este procedimento armazenado é fornecido para utilizadores que pretendem gerir diretamente o processo de limpeza da tabela de alterações. No entanto, deve-se ter cautela, pois o procedimento afeta todos os consumidores dos dados na tabela de alteração.

Transact-SQL convenções de sintaxe

Syntax

sys.sp_cdc_cleanup_change_table
    [ @capture_instance = ] N'capture_instance'
    , [ @low_water_mark = ] low_water_mark
    [ , [ @threshold = ] threshold ]
    [ , [ @fCleanupFailed = ] fCleanupFailed OUTPUT ]
[ ; ]

Arguments

[ @capture_instance = ] N'capture_instance'

O nome da instância de captura associada à tabela de mudanças. @capture_instance é sysname, sem padrão, e não pode ser NULL.

@capture_instance deve nomear uma instância de captura que exista na base de dados atual.

[ @low_water_mark = ] low_water_mark

Um número de sequência logarítmica (LSN) que é usado como o novo ponto mais baixo para o @capture_instance. @low_water_mark é binário(10), sem padrão.

Se o valor não NULLfor , deve aparecer como o start_lsn valor de uma entrada atual na tabela cdc.lsn_time_mapping . Se outras entradas partilharem cdc.lsn_time_mapping o mesmo tempo de commit que a entrada identificada pela nova marca de água baixa, o menor LSN associado a esse grupo de entradas é escolhido como marca de água baixa.

Se o valor for explicitamente definido para NULL, o @low_water_mark corrente para a @capture_instance é usado para definir o limite superior para a operação de limpeza.

Note

@low_water_mark é o limiar LSN. Qualquer transação com um valor LSN inferior ao fornecido é processada, e o valor em questão é excluído.

[ @threshold = ] limiar

O número máximo de entradas eliminadas que podem ser eliminadas usando uma única instrução na limpeza. @threshold é bigint, com um padrão de 5000.

[ @fCleanupFailed = ] fCleanupFailed OUTPUT

Um parâmetro que indica se a operação de limpeza falhou OUTPUT ou não. @fCleanupFailed é bit, com um padrão de 0.

Conjunto de resultados

Nenhum, a menos que seja usado o parâmetro opcional @fCleanupFailed OUTPUT.

Valores de código de retorno

0 (sucesso) ou 1 (fracasso).

Examples

-- Declaring a variable and Setting to zero first
SELECT @cleanup_failed_bit = 0;

-- Execute cleanup and obtain output bit
EXECUTE
    @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

Remarks

sys.sp_cdc_cleanup_change_table Executa as seguintes operações:

  1. Se o parâmetro @low_water_mark for NULL, o start_lsn valor para o @capture_instance permanece inalterado. No entanto, se a marca de água mínima atual for maior do que o valor da marca de água inferior especificado usando o parâmetro @low_water_mark para o procedimento, é lançado o Erro 22957 . 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', is not within the Change Data Capture timeline [%s, %s].

    Note

    A nova marca de água baixa pode não ser a marca de água baixa especificada na chamada de procedimento armazenado. Se outras entradas na cdc.lsn_time_mapping tabela partilharem o mesmo tempo de commit, a menor start_lsn representada no grupo de entradas é selecionada como a marca de água baixa ajustada. Se o parâmetro @low_water_mark for NULL ou a marca de água mínima atual for maior do que a nova marca de água baixa, o start_lsn valor da instância de captura permanece inalterado.

  2. As entradas da tabela de alterações com __$start_lsn valores inferiores à marca de água baixa são então eliminadas. O limiar de eliminação é usado para limitar o número de linhas eliminadas numa única transação. É reportada uma falha em eliminar entradas com sucesso, mas não afeta qualquer alteração na marca de água baixa da instância de captura que possa ter sido feita com base na chamada.

  3. Se o sys.sp_cdc_cleanup_change_table procedimento armazenado expirar após atualizar para start_lsn a instância de captura mas sem eliminar os dados da tabela de alteração, 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 retém os dados para o período de retenção especificado. O start_lsn valor em cdc.change_tables deve ser tratado como o novo ponto mais baixo. O sys.sp_cdc_cleanup_change_table procedimento armazenado não define o start_lsn valor para corresponder ao novo período de retenção de dados especificado. O procedimento realiza sempre a limpeza com base na marca de água baixa. Especificar um valor para o parâmetro @low_water_mark igual ou superior ao start_lsn valor em cdc.change_tables evita gerar o Erro 22957.

  4. Se usar sys.sp_cdc_cleanup_change_table para gerir o processo da tabela de limpeza e ocorrer um bloqueio entre a varredura do CDC e a limpeza do CDC quando sys.sp_cdc_cleanup_change_table é invocado, o Erro 22852 é registado com gravidade 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:

  • Os relatórios de trabalho do Agente de limpeza apagam falhas.

    Um administrador pode executar este procedimento armazenado explicitamente para tentar novamente uma operação falhada. Para tentar novamente a limpeza de uma dada instância de captura, execute sys.sp_cdc_cleanup_change_table, e especifique NULL para o parâmetro @low_water_mark .

  • A política simples baseada na retenção usada pelo trabalho de agente de limpeza não é suficiente.

    Como este procedimento armazenado realiza a limpeza de uma única instância de captura, pode ser usado para construir uma estratégia de limpeza personalizada que adapta as regras de limpeza à instância de captura individual.

Permissions

Requer associação à função fixa de base de dados db_owner.