我有一个启用 CDC 的表用于复制。我的一个存储过程针对特定情况手动运行此
exec sys.sp_cdc_scan
(我的存储过程由我创建的 DDL 触发器调用)。但手动运行存储过程后,我发现 CDC 的自动捕获作业不起作用。每次我都必须手动运行 sys.sp_cdc_scan
才能将 DML 更改捕获到我的捕获实例中。我不知道为什么会发生这种情况。任何线索都会有帮助。
我正在运行 Azure SQL 数据库。
运行
sys.sp_cdc_scan
的原因是为了确保我在执行任何DML操作时立即在捕获实例中获得DML操作,简单来说
begin tran
insert into t1(col1) values(1);
select * from cdc.dbo_t1_CT;
commit tran
在上述情况下,我不会在捕获实例中获得任何记录,但是如果我设法像这样编写我的交易
begin tran
insert into t1(col1) values(1);
exec sys.sp_cdc_scan;
select * from cdc.dbo_t1_CT;
commit tran
我一进行DML操作就得到了capture实例中的记录,这正是我所需要的。
好吧,问题是每当会话手动运行
sys.sp_cdc_scan
时,它都需要断开与服务器的连接,以便 sys.sp_cdc_scan
的自动调度可以工作。当我重新连接到我的 sqlserver 实例时,问题自行解决了。
SQLServer 小CDC小技巧
当我们遇到与CDC相关的错误时,我们应该首先查询这个表
sys.dm_cdc_errors
。它为我们提供了有助于调试问题的重要信息。借助此表本身,我能够找到问题的根本原因。