You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨云SQL Server增量同步:如何高效处理硬删除标记需求

跨云SQL Server数据同步优化方案

方案1:源端新增变更日志表+触发器捕获删除操作

因为源端是硬删除且无历史记录,核心痛点是抓不到被删除的业务Key。可以在源端SQL Server做以下改造:

  • 创建一张table_change_log表,字段至少包含business_key、operation_type(可选值:新增/更新/删除)、operation_time
  • 在源表上创建INSERT/UPDATE/DELETE触发器:
    • 新增/更新操作触发时,把对应的business_key、操作类型、当前时间插入日志表;更新场景也可同步lastUpdated字段,方便后续增量筛选
    • 删除操作触发时,把被删的business_key、操作类型删除、当前时间插入日志表
  • 每次同步流程:
    1. 拉取上次同步时间之后,日志表中operation_type为新增/更新的记录,通过business_key关联源表获取完整数据,执行merge完成upsert
    2. 拉取上次同步时间之后,日志表中operation_type为删除的business_key集合,在目标表中将这些Key对应的isDeleted标记为true
  • 优势:完全基于增量操作,资源消耗低,能精准捕获删除行为,不会出现误标删除的情况

方案2:增量Upsert+定期对比业务Key集合

如果不想修改源端结构,可以拆分同步流程,减少全量数据传输:

  • 第一步(Upsert):继续用lastUpdated字段拉取上次同步后的增量数据,执行merge完成新增和更新(这部分你已验证可行)
  • 第二步(标记删除):
    1. 从源端导出当前所有的business_key(仅导出Key,不要全表数据),可用bcp工具或批量导出到临时存储(如S3转Azure Blob)
    2. 在目标端创建临时表,导入源端的business_key集合
    3. 执行更新语句:
      UPDATE target_table 
      SET isDeleted = 1 
      WHERE business_key NOT IN (SELECT business_key FROM temp_source_keys) 
        AND isDeleted = 0
      
  • 优势:无需修改源端,仅传输Key集合,数据量远小于全表(8000万条int类型Key仅约320MB,跨云传输压力小)
  • 注意:若业务Key为字符串类型,建议分批对比或用哈希值匹配,避免内存溢出

方案3:开启源端CDC(变更数据捕获)功能

如果源端AWS RDS SQL Server支持CDC(多数版本均支持),可直接用系统原生的变更捕获能力:

  • 在源端开启目标表的CDC功能,示例SQL如下:
    -- 开启数据库级CDC
    EXEC sys.sp_cdc_enable_db
    -- 开启表级CDC,指定需捕获的列
    EXEC sys.sp_cdc_enable_table
      @source_schema = N'dbo',
      @source_name = N'your_source_table',
      @role_name = NULL,
      @captured_column_list = N'business_key, lastUpdated' -- 按需指定字段
    
  • CDC会自动生成系统表记录所有变更(包括删除),每次同步时读取上次同步LSN之后的变更记录:
    • 针对新增/更新记录,关联源表获取完整数据执行upsert
    • 针对删除记录,提取business_key去目标表标记isDeleted
  • 优势:无需自行维护触发器和日志表,由SQL Server原生支持,稳定性更高,变更捕获更精准

内容的提问来源于stack exchange,提问作者Sanket Kelkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:25:17