[英]How to fully Automate CDC in SQL Server?
有没有办法在活动的 SQL Server 数据库中 100% 自动化 SQL Server CDC 初始化? 我正在尝试解决在第一次 cdc 数据捕获期间发现from_lsn
的问题。
事件顺序:
问题:
from_lsn
fn_cdc_get_all_changes_Schema_Table(from_lsn, to_lsn, '<row_filter_option>')
函数的 from_lsn笔记:
在进行初始加载之前,获取fn_cdc_get_max_lsn()
的值并存储它。 此函数返回所有捕获实例中 CDC 已知的最高 LSN。 这是整个数据库的高水位线。
复制整个表格。
开始您的增量过程。 第一次调用 delta 函数时, min_lsn
参数的值将是之前从fn_cdc_get_max_lsn()
检索到的存储值。 从fn_cdc_get_max_lsn()
获取当前值(不是存储的)并将其用作max_lsn
参数的值。
从这里按您的预期进行。 获取从 delta 函数返回的最大 LSN,存储它。 下次拉增量时,对存储的值使用fn_cdc_increment_lsn
,将结果用作min_lsn
参数的值,并将fn_cdc_get_max_lsn()
的结果用作max_lsn
参数。
通过此过程,您将永远不会错过任何数据。
现在,您提到要避免“重复”。 但是,如果您尝试在这种情况下定义“重复”是什么,我认为您会发现它很困难。
例如,假设我有这个表开始:
create table t(i int primary key, c char);
insert t(i, c) values (1, 'a');
fn_cdc_get_max_lsn()
并得到0x01
。insert t(i, c) values (2, 'b');
0x02
的 LSN 值相关联。min_lsn
参数将是0x01
。 因此,我将在增量中获得{2, 'b'}
行。
但我已经检索了行{2, 'b'}
作为初始加载的一部分。 这是“重复”吗? 不,这代表对表格的更改。 当我将这个增量加载到我的目的地时,我将如何处理它? 实际上只有两种选择。
选项 1:我将根据主键将增量合并到目标表中。 在这种情况下,当我合并增量时,我将用新行{2, 'b'}
覆盖已经加载的行{2, 'b'}
, 'b'} ,其结果看起来与不做任何事情相同。
选项 2:我要将所有更改附加到目的地。 在这种情况下,我的目标表将包含行{2, 'b'}
两次。 这是重复的吗? 不,因为这两行代表数据在不同逻辑时间的外观。 首先是当我进行初始加载时,然后是当我进行增量时。
如果您试图争辩这实际上是重复的,那么我通过给您这个假设场景来反驳:
{1, 'a'}
,update T set c = 'b' where i = 1
。{1, 'b'}
。update T set c = 'a' where i = 1
。{1, 'a'}
。问题:您在第三个增量期间检索到的行是“重复的”吗? Is 与我们之前检索到的行具有相同的值。
如果您的回答是“是”,那么您将永远无法消除“重复”读取,因为只要一行发生突变以具有与之前某个时间点相同的值时,就会发生“重复”,这是您在无法控制。 如果这是您需要在追加方案中消除的“重复项”,则必须通过将传入值与现有值进行比较,在目的地执行消除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.