我在几个非空表上启用了 CDC,是 cdc 下的 CDC 系统表。在我对基本用户表执行 DDL/DML 之前,模式仍然为空?

i have enabled CDC on few non-empty tables , are the CDC system tables under cdc. schema remains empty till i do DDL/DML on the base user tables?

我正在使用 ssis 作业根据系统创建的 cdc tables(后缀为 _CT)的 lsn 值从源到目标获取 CDC 数据。

当我启用 CDC 时,基础 table 已经有很多行。

现在,在第一个 ssis 运行 中,我需要在开始执行 DML 操作之前根据 lsn 提取所有现有数据,但是所有 cdc table 都是空的。

所以问题是,如果我们在非空 table 上启用 cdc,在我们开始更改数据之前它不会在 cdc 系统 tables 中有 cdc 数据吗?

简短的回答是:不 - CDC table 不会有初始数据的副本。通过从事务日志中读取更改(插入、更新、删除)并将它们插入 CDC tables 来填充 CDC tables。

我会使用数据快照或备份来初始化您的数据。具体来说:

  1. 在您的 table(s)
  2. 上启用 CDC
  3. 创建数据库备份并将其还原到某处或拍摄数据库快照
    • 如果使用数据库备份,请记下检查点LSN;你可以在 msdb.dbo.backupset
    • 中找到它
    • 如果使用数据库快照,记下快照的LSN;您可以使用 DBCC DBINFO(DATABASENAME) WITH TABLERESULTS; 找到它(全部归功于 this link
  4. 从您在上一步中创建的数据库批量加载到您的最终目的地。
  5. 对于来自 CDC 数据的下一次(增量)加载,您可以使用上一步中的 LSN 传递给 cdc.fn_cdc_get_all_changes_<capture_instance>()cdc.fn_cdc_get_net_changes_<capture_instance>() 函数。这将为您提供从您用于执行初始加载的备份或快照所代表的时间点开始发生的更改。