用架构能不能复用。今天这篇文章就来聊聊这个话题。SQL Server CDC 的增量数据由 SQL Server 事务日志进入捕获流程再写入 CDC 变更表。同步任务在增量阶段读取 CDC 变更表和相关元数据。对已经部署 Always On 的环境可以将这部分操作放到可读副本让主库继续专注业务写入和 CDC 捕获同步账号只需要读取角色从而降低对核心库的权限和性能影响。SQL Server CDC 增量读取原理SQL Server CDC 的增量读取入口不是业务表本身而是启用 CDC 后生成的 capture instance 和对应的 CDC 变更表。每个启用 CDC 的业务表都会对应一张 CDC 变更表命名通常为cdc.capture_instance_CT。业务表发生 INSERT、UPDATE、DELETE 后变更会先写入 SQL Server 事务日志再由 SQL Server Agent 的 CDC capture job 捕获并写入对应的 CDC 变更表。同步任务消费增量数据时主要读取cdcschema 下的几类对象cdc.capture_instance_CT存放业务表的 DML 变更是最核心的数据来源cdc.change_tables记录 capture instance、源表、起始 LSN 等信息用于识别 CDC 表和可读范围cdc.captured_columns、cdc.index_columns、cdc.ddl_history等元数据则用于识别捕获列、索引列和 DDL 历史。其中_CT表中的每条记录除了业务字段外还包含几类关键 CDC 字段__$start_lsn变更所属事务的提交 LSN是增量推进的主要位置。__$seqval同一 LSN 下的操作序列用于区分多条变更的先后顺序。__$operation操作类型1 表示删除2 表示插入3 表示更新前镜像4 表示更新后镜像。__$update_mask标识 UPDATE 涉及的列。因此SQL Server CDC 增量读取的核心是按照__$start_lsn、__$seqval、__$operation等字段顺序消费_CT表中的变更记录并将 INSERT、DELETE、UPDATE 前后镜像转换为下游可以处理的变更事件。Always On 备库 CDC 原理在 Always On 场景下SQL Server CDC 的捕获仍由主副本完成。业务 DML 写入事务日志后SQL Server Agent 的 capture job 从日志中捕获变更并写入主副本上的 CDC 变更表cleanup job 按配置的保留时间清理历史变更。这些 CDC 变更表和相关元数据会随 Always On 日志同步和 Redo 在可读副本上可见。CloudCanal 连接可读副本后读取已经同步过来的cdc.capture_instance_CT、cdc.change_tables等对象完成增量消费。因此Always On 场景下的优化点不是改变 SQL Server CDC 的捕获方式而是把同步任务对 CDC 表的持续查询从主副本转到可读副本。主副本继续处理业务写入和 CDC 捕获可读副本提供同步链路所需的 CDC 读取。静态 CDC 与最小权限运行SQL Server CDC 初始化需要较高权限。数据库级 CDC 需要sysadmin服务器角色表级 CDC 和 capture instance 创建则需要db_owner角色。这些操作通常由 DBA 在主库侧一次性完成。这里说的“静态 CDC”指的是 CDC 相关对象由 DBA 预先创建完成后续同步任务在运行阶段不再动态创建 capture instance只消费已经准备好的 CDC 表和元数据。这种模式下DBA 可以提前按固定格式db_schema_table_cc_static为订阅表创建好 CDC capture instance。后续同步账号只需对业务 schema 和 cdc schema 拥有SELECT权限即可持续消费 CDC 数据不再需要任何写入或管理类权限。这种权限模型适合核心库。同步账号不需要长期持有sysadmin或db_owner日常运行阶段保持读权限即可。对权限审计严格的 SQL Server 生产库来说这往往是方案能否落地的关键。表级多位点推进SQL Server CDC 中每张表的_CT捕获表是独立的不同表的变更进度天然不同。如果只维护一个全局 LSN会导致同步任务重复消费数据。多位点机制的核心是按表独立维护进度。每张表的位点主要记录当前读取到的 LSN 和__$seqval读取 CDC 变更表时再结合__$operation识别操作类型LSN日志序列号定位事务边界__$seqval同一 LSN 内多条变更的序列值区分同一事务内的操作顺序__$operation操作类型1删除, 2插入, 3更新前, 4更新后在多表订阅、任务暂停恢复、CDC 表积压等场景下多位点更容易定位问题哪张表读到哪、哪张表出现延迟一目了然。总结SQL Server Always On 场景下CDC 捕获仍由主副本完成增量数据同步连接可读副本读取 CDC 表。这样既能复用已有高可用架构减少同步读取对主库的影响也能让运行账号保持最小权限。对主库负载敏感、权限要求严格的核心 SQL Server 库这是一种更适合长期运行的 CDC 同步方式。