它是如何工作的? cdc是什么意思?( 二 )


  • 容易出错 , 并可能导致数据出现一致性问题 。
  • 表的差异与增量 这种CDC方法使用诸如:表增量(table delta)之类的实用程序 , 或tablediff , 去比较两个表中的数据 , 以发现不匹配的行 。据此 , 您可以使用其他的脚本 , 将源表的差异同步到目标表上 。
    虽然该方法在管理已删除行的方面 , 比时间戳CDC的效果更好 , 但是它在发现差异时 , 所需要的CPU资源较为显著 。而且此类开销会随着数据数量的增加 , 而呈线性增加 。此外 , 针对源数据库或生产环境的分析查询 , 也可能会降低应用本身的性能 。对此 , 您可以定期将数据库导出至暂存环境中进行比较 。不过 , 随着数据量的增加 , 此类传输的成本也会呈指数级增长 。
    表差异的另一个问题是 , 它无法捕获数据的临时性变更 。例如 , 假设有人更新了某个字段 , 但随后又将其变更回了原始值 。那么 , 如果您只是运行一个简单比较的话 , 将无法捕获到这个变更事件 。而由于diff方法本身存在着延迟 , 因此也无法实时执行 。
    优点:
    • 可使用各种原生的SQL脚本 , 来获取变更数据的准确视图 。
    缺点:
    • 由于此方法会用到数据源的三个副本:原始数据、先前快照和当前快照 , 因此整体存储需求会有所增加 。
    • 在那些具有繁重事务负载的应用程序中 , 无法得到很好的扩展 。
    注意:表差异和时间戳CDC方法 , 都不适用于真实的生产环境 。因此对于大型数据集 , 我建议您使用如下两种CDC方法 。其实 , 基于触发器和事务日志的变更数据跟踪方法 , 只是出于相同目的的两种不同的服务方式 。
    基于触发器的CDC
    它是如何工作的? cdc是什么意思?

    文章插图


    • 我们需要为参与数据复制的每个表 , 创建三个触发器 , 当数据记录发生如下特定事件时 , 则会触发相应的操作:
    1. 将新的记录插入数据表时 , 触发的是INSERT触发器 。
    2. 数据记录发生变更时 , 触发的是UPDATE触发器 。
    3. 数据记录被删除时 , 触发的是DELETE触发器 。
    • “事件历史”的影子表被存储在数据库本身 , 并由各种状态改变事件的序列所组成 。
    • 每当对象的状态发生变化时 , 新的事件都会被附加到该序列中 。据此 , 有关变更记录的信息 , 也会被转移到“事件历史”的影子表中 。
    • 最后 , 根据历史表中的各个事件 , 变更会被传输到目标数据库中 。
    下面展示了一个简单的历史表:
    它是如何工作的? cdc是什么意思?

    文章插图


    由于源数据库中的每个表都需要一个触发器 , 因此在有变更发生时 , 在操作表上运行触发器的开销也会随之增加 。不过 , 由于基于触发器的CDC是工作在SQL级别上的 , 因此许多用户会趋向于使用该方法 。
    优点:
    • 非常可靠且详尽 。
    • 影子表可以提供所有事务的不可变详细日志 。
    缺点: