Debezium对接SQL Server Always ON闲置数日后CDC复制失效求助
针对SQL Server Always ON环境下Debezium 1.9.5闲置后CDC停止同步的问题,可按以下步骤排查:
检查SQL Server CDC作业状态
首先确认CDC捕获和清理作业是否正常运行,闲置期间作业可能意外停止。执行SQL命令查看作业状态:EXEC sys.sp_cdc_help_jobs;若捕获作业(capture job)未启用或最近运行失败,手动启动作业并配置自动重启策略。同时确保Always ON所有副本节点上的SQL Server代理服务均处于运行状态,CDC功能在主副本和可读副本上正确启用。
验证Debezium偏移量(Offset)
Debezium可能卡在某个旧的LSN(日志序列号)位置,未推进到最新CDC日志。查看连接器的offset记录:
使用Kafka控制台消费者读取offset主题(默认是__consumer_offsets):kafka-console-consumer.sh --bootstrap-server <kafka-host>:9092 --topic __consumer_offsets --from-beginning --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter"找到对应连接器的offset条目,对比SQL Server当前CDC日志的LSN:
SELECT MAX(start_lsn) FROM cdc.lsn_time_mapping;如果offset中的LSN远小于上述查询结果,说明连接器未正确推进偏移量,需后续调整。
排查Debezium连接器日志
即使连接器状态显示RUNNING,也可能存在未触发错误的警告信息。检查连接器的日志文件,重点关注:- 数据库连接超时或断开的警告
- LSN不存在或CDC日志缺失的提示
- Always ON副本切换后的连接异常
针对闲置连接被断开的问题,可在连接器配置中添加连接池参数,确保自动重连:
connection.max.idle.ms=300000 connection.validation.timeout.ms=3000检查CDC日志清理策略
若CDC清理作业提前删除了Debezium未读取的日志,会导致同步中断。查看清理作业的保留时长:EXEC sys.sp_cdc_help_jobs;若保留时长过短,调整为合适的值(比如保留72小时):
EXEC sys.sp_cdc_change_job @job_type='cleanup', @retention=4320;同时检查是否存在LSN断层:
SELECT * FROM cdc.lsn_time_mapping ORDER BY start_lsn DESC;如果连接器offset中的LSN不在此结果中,说明日志已被清理,需重新执行快照同步。
验证Always ON监听器可用性
闲置期间监听器可能出现路由异常,尝试用sqlcmd连接监听器验证:sqlcmd -S <listener-name> -U <db-user> -P <db-password> -Q "SELECT @@SERVERNAME;"若连接不稳定或无法访问,检查Always ON集群状态,确保监听器正常指向主副本,网络无防火墙拦截。
重置连接器偏移量(谨慎操作)
若确认偏移量卡住且无未处理的业务数据,可重置连接器偏移量:- 暂停连接器:
curl -X PUT http://<connect-host>:8083/connectors/<connector-name>/pause - 删除对应连接器的offset记录(通过Kafka工具定位并删除)
- 重启连接器:
curl -X PUT http://<connect-host>:8083/connectors/<connector-name>/resume
或修改连接器配置为
snapshot.mode=schema_only_recovery,重新启动后连接器将从当前CDC日志开始同步。- 暂停连接器:
内容的提问来源于stack exchange,提问作者Akshay

