Estou executando a consulta abaixo para encontrar tabelas CDC com dados além da profundidade de retenção configurada:
SELECT DB_ID() AS database_id, ct.capture_instance, object_id, source_object_id
, rcounts.source_table_rows
, rcounts.ct_table_rows
, ct_pstats.used_page_count
, source_pstats.used_page_count
, sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_min_lsn(ct.capture_instance))
from cdc.change_tables AS ct
outer apply
(
select source_table_rows = (SELECT SUM(rows) FROM sys.partitions AS p WHERE p.object_id = ct.source_object_id AND p.index_id <= 1)
, ct_table_rows = (SELECT SUM(rows) FROM sys.partitions AS p WHERE p.object_id = ct.object_id AND p.index_id <= 1)
) as rcounts
outer apply
(
select used_page_count = SUM(used_page_count)
from sys.dm_db_partition_stats AS ps
where ps.object_id = ct.object_id
) AS ct_pstats
outer apply
(
select used_page_count = SUM(used_page_count)
from sys.dm_db_partition_stats AS ps
where ps.object_id = ct.source_object_id
) AS source_pstats
outer apply
(
select *
from msdb.dbo.cdc_jobs
where job_type = 'cleanup'
and database_id = DB_ID()
) as cleanup
WHERE DATEADD(minute, 60*25, sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_min_lsn(ct.capture_instance))) < DATEADD(minute, -cleanup.retention, GETDATE())
Isso retorna muitos resultados em que a diferença entre o tempo mínimo de lsn e a retenção de CDC configurada é superior a 25 horas.
O tempo de retenção configurado é de 5.000 minutos e o tempo mínimo de lsn é superior a 5.800 minutos no momento da redação deste artigo.
Para tentar resolver isso, executei o cdc.cleanup
trabalho manualmente. Foi concluído com sucesso, mas não fez nenhuma alteração.
Em seguida, executei manualmente o procedimento sp_cdc_cleanup_change_table
para cada uma das instâncias de captura e elas foram concluídas com êxito, mas, novamente, não fiz alterações.
EXEC sys.sp_cdc_cleanup_change_table @capture_instance = '...', @low_water_mark = NULL, @threshold = 5000;
Suspeitamos que esse problema esteja relacionado a um failover que ocorreu na mesma época, mas desde então já fizemos o failover para a réplica primária original.
Alguém pode aconselhar como resolver essa latência na limpeza sem precisar desabilitar e reativar o CDC?
Obrigado
Detalhes do ambiente:
- SQL Server 2014 Enterprise Edition, versão 12.0.6024
- Grupo de disponibilidade AlwaysOn com 3 nós - 2 síncronos com failover automático e um assíncrono.
OP aqui.
Ok, depois de alguns dias, o problema parece ter sido resolvido sozinho.
Parece que o SQL Server simplesmente precisava de mais tempo para realizar a limpeza.