sql server cdc漏扫数据

SQL Server的CDC指的是"变更数据捕获"(Change Data Capture)。这是SQL Server数据库提供的一项功能,能够跟踪并记录对数据库表中数据所做的更改。这些更改包括插入、更新和删除操作。CDC可以捕获这些变更的详细信息,并使这些信息可用于进一步的处理,例如数据同步、数据仓库的更新或其他业务需求。

做了一个基础服务,定时扫cdc表的数据然后再数据同步到es上。运行一段时间后,发现es上的数据总是丢失变化。我想一个晚上,仍不知道自己错哪了。究竟是定时扫cdc的表拉取数据漏扫数据,还是数据处理出错呢,还是es同步数据出错呢?无奈日志打印内容太少了,只能增加日志重新部署生产观察了。

分析了一个晚上,终于找到原因了。

定时扫cdc的sql是类似这样

select * from table_CT with(nolock) where id>=@param order by id

扫到数据,处理完数据后把@param替换成上次扫的最大id,接着继续扫。

查询日志发现这条sql会漏扫数据。已知id是自增的,看着是没什么问题的。

with(nolock)是避免锁表,允许脏读(cdc表没有回滚的操作),第一眼看上去没什么问题。最读提前读到未提交的id,也没什么问题。

再细想,有问题,涉及到cdc如何捕获数据变更写入到变更表中。

把with(nolock)去掉,问题得到解决。

一看时间是凌晨4点钟,赶紧打电话给同事告诉他们这个好消息。

相关推荐
Coder_Boy_3 分钟前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
阿杰 AJie8 分钟前
MySQL 聚合函数总表(完整版)
数据库·mysql
玄同76517 分钟前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
cdut_suye18 分钟前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
尽兴-20 分钟前
MySQL 8.0高可用集群架构实战深度解析
数据库·mysql·架构·集群·高可用·innodb cluster
遇见火星27 分钟前
MySQL常用命令大全(2026最新版)
数据库·mysql·oracle
霖霖总总43 分钟前
[小技巧42]InnoDB 索引与 MVCC 的协同工作原理
运维·数据库·mysql
未来之窗软件服务1 小时前
计算机等级考试—数据库完整性进销存—东方仙盟练气期
数据库·oracle·计算机软考·仙盟创梦ide·东方仙盟
weixin_541299941 小时前
鸿蒙应用开发:保存应用数据 - 关系型数据库的使用
数据库·oracle·harmonyos
wei_shuo1 小时前
Oracle数据库迁移至KingbaseES:完整实战指南
数据库·oracle