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

CDC 同步延迟 / 状态排查 SQL
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,会增加索引维护开销。
分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS