1. 查看捕获作业运行状态
EXEC sys.sp_cdc_help_jobs;
-- 关注 capture 行的 running(应为1)、maxtrans、pollinginterval
若 running = 0,手动启动:
EXEC sys.sp_cdc_start_job @job_type = 'capture';
2. 查看最近日志扫描会话的延迟与吞吐
-- 最近一次扫描的延迟(秒)和吞吐
SELECT
session_id,
start_time,
end_time,
duration,
latency, -- 延迟(秒),关键指标
tran_count, -- 本会话处理的事务数
empty_scan_count, -- 空扫描次数(无变更时累加)
log_record_count
FROM sys.dm_cdc_log_scan_sessions
WHERE session_id = 0; -- session_id=0 为最近一次有效会话
查看是否存在大量空扫描:
SELECT * FROM sys.dm_cdc_log_scan_sessions
WHERE empty_scan_count > 0;
3. 计算 CDC 实际处理滞后时间(LSN 对比法)
USE YourDatabaseName;
GO
-- 当前事务日志中最新提交时间(近似)
DECLARE @LatestCommitTime DATETIME;
SELECT TOP 1 @LatestCommitTime = tran_end_time
FROM cdc.lsn_time_mapping
ORDER BY start_lsn DESC;
-- CDC 已处理到的最大 LSN 对应的时间
DECLARE @CDCLastProcessTime DATETIME;
SELECT @CDCLastProcessTime = tran_end_time
FROM cdc.lsn_time_mapping
WHERE start_lsn = sys.fn_cdc_get_max_lsn();
-- 延迟(秒)
SELECT
@LatestCommitTime AS Last_DB_Commit_Time,
@CDCLastProcessTime AS CDC_Processed_Until_Time,
DATEDIFF(SECOND, @CDCLastProcessTime, @LatestCommitTime) AS CDC_Latency_Seconds;
4. 查看 CDC 错误记录
SELECT TOP 100 *
FROM sys.dm_cdc_errors
ORDER BY entry_time DESC;
5. 检查捕获实例及变更表是否正常
-- 已启用的捕获实例
SELECT *
FROM cdc.change_tables;
-- LSN-Time 映射最新几条
SELECT TOP 20 *
FROM cdc.lsn_time_mapping
ORDER BY start_lsn DESC;
四、调优经验小结
延迟持续增大 → 先确认 capture job 在运行 → 看 sys.dm_cdc_log_scan_sessions.latency→ 适当加大 @maxtrans/@maxscans或 减小 @pollinginterval。
事务日志暴涨且不截断 → 查 sys.databases.log_reuse_wait_desc,若是 REPLICATION/CDC说明捕获跟不上,需调大吞吐或排查 I/O。
只捕获必要列 → sys.sp_cdc_enable_table @captured_column_list可显著降低变更表写入压力。
不建议在高负载库开启 @supports_net_changes = 1,会增加索引维护开销。



SQLSERVER:CDC同步延迟问题排查处理