我正在运行下面的查询来查找数据超出配置的保留深度的 CDC 表:
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())
这会返回大量结果,其中最短 lsn 时间与配置的 CDC 保留时间之间的差距超过 25 小时。
配置的保留时间为 5000 分钟,在撰写本文时,最小 lsn 时间超过 5800 分钟。
为了尝试解决这个问题,我手动执行了该cdc.cleanup
作业。它已成功完成,但没有进行任何更改。
sp_cdc_cleanup_change_table
然后,我手动执行每个捕获实例的过程,它们成功完成,但同样没有进行任何更改。
EXEC sys.sp_cdc_cleanup_change_table @capture_instance = '...', @low_water_mark = NULL, @threshold = 5000;
我们怀疑此问题与大约在同一时间发生的故障转移有关,但从那时起我们已经故障转移回原始主副本。
谁能建议如何解决清理中的延迟问题,而无需禁用并重新启用 CDC?
谢谢
环境详情:
- SQL Server 2014 企业版,版本 12.0.6024
- AlwaysOn 可用性组具有 3 个节点 - 2 个具有自动故障转移功能的同步节点,以及 1 个异步节点。