Debezium 与 SQL Server 从实际表以及捕获表中获取快照

Posted

技术标签:

【中文标题】Debezium 与 SQL Server 从实际表以及捕获表中获取快照【英文标题】:Debezium with SQL Server take snapshot from actual table as well as capture table 【发布时间】:2021-09-07 04:59:54 【问题描述】:

我已经使用 Debezium 和 SQL Server 实现了发件箱模式,通过关闭以下指南:Reliable Microservices Data Exchange With the Outbox Pattern。

根据指南,我正在我的应用程序的同一事务中对发件箱事件进行“插入 + 删除”。这意味着在事务结束时,发件箱表实际上保持为空。事务日志知道插入和删除操作,因此信息不会丢失。 SQL Server 的 CDC 捕获作业然后“跟踪”此事务日志并将这些记录移动到捕获表中。我已将此捕获表的保留期保持为 3 天(默认值)。

当我启动 Debezium 连接器时,它首先拍摄发件箱表的快照,然后继续捕获捕获表中的事件,并在它们到来时捕获它们。问题在于我的发件箱表实际上是空的,因此快照不会产生任何结果。但是捕获表中可能有一些事件是在连接器启动之前创建的。

除了发件箱表之外,还有没有办法将 Debezium 配置为对捕获表进行完整快照?或者我在设置发件箱模式以避免遇到此问题时遗漏了什么?

我喜欢现有的设置,因为这意味着我无需进行任何内务处理即可将发件箱表保持在合适的大小。我知道我不能在我的应用程序中执行“插入 + 删除”,而只能执行“插入”以便填充发件箱表。然后我可以有一个存储过程/外部脚本,它从发件箱表中清除超过一段时间(例如 3 天)的记录。我试图避免这种额外的内务处理的开销。

【问题讨论】:

【参考方案1】:

这里的主要问题更符合“鸡与蛋”的范式。

如果连接器是新的,它将查看事务日志并记录当前位置,执行您配置连接器执行的任何类型的快照步骤,然后才会开始流式传输,但它会这样做从我们一开始获得的当前位置开始。

对于发件箱模式,如果您想保持执行 插入 + 删除 的想法以最小化发件箱表上的簿记开销,您只需确保启动首先连接器,让它执行您配置的任何初始快照任务并记录偏移量。完成此操作后,您就可以安全地操作发件箱表中的记录,它们将被拾取并按您希望的方式流式传输。

【讨论】:

以上是关于Debezium 与 SQL Server 从实际表以及捕获表中获取快照的主要内容,如果未能解决你的问题,请参考以下文章

Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行

Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行

SQL Server 的 Debezium 连接器,并希望在 debezium 层进行过滤

安装 Debezium SQL Server CDC 源连接器

无法将 Debezium 0.9.2 连接到 SQL Server 2008 R2

成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC