Change Data Capture(一)

时间:2024-03-30 19:10:41
作者:NinGoo | 【转载时请务必以超链接形式标明文章原始出处和作者信息】

一、概述

CDC(Change Data Capture)是oracle在数据库级别实现的增量抽取解决方案。在一般的ETL过程中,对于增量抽取,无非是在数据上加时间截,全记录比对,关键字段比对,日志分析抽取等几种方法,要么需要修改原表结构,要么需要大量的算法,要么借助第三方的工具实现。Oracle从9i开始引入的CDC特性,使得有机会在数据库层面上直接实现增量抽取功能,在性能方面由于和数据库引擎的直接集成,比第三方工具应该具有一定的优势。

CDC有两个模式:同步和异步。两种模式的实现机制是截然不同的。同步CDC主要是采用触发器记录新增数据,基本能够做到实时增量抽取。而异步CDC则是通过分析已经commit的日志记录来得到增量数据信息,有一定的时间延迟,并且提供了到Oracle Streams的接口。同步CDC在企业版或者标准版中都可以使用,异步CDC则只包含在企业版中。注意CDC在9i和10g中有了比较大的改变,异步CDC主要采用了和Streams相同的技术。

CDC中将系统分为两个角色:发布者和订阅者。发布者主要负责捕获增量数据,订阅者则将增量数据传递给实际应用。这些任务都可以通过oracle提供的PL/SQL包实现。

二、名词解析

Change Source

增量数据的抽取来源,比如同步CDC模式是通过trigger直接从database中获取的,change source就是source database。异步CDC模式则是从日志文件中获取的,则change source则表示redo logfile。

Change Set

一组逻辑上相关的增量数据,需要保证其一致性。change set必须是某个change source的成员。对于异步分布式HotLog模式,同一个change source的所有change set必须在同一个staging database中。而异步AutoLog模式中一个change source只能有一个change set。

Change Table

一个change table对应一个source table,用于保存source table中的增量数据。Change table中除了需要保存source table的增量数据,还有一些控制列用于保存相关的元数据。

三、CDC模式介绍

前面讲到同步CDC和异步CDC模式。同步的比较简单,就是通过触发器捕获增量数据,类似于物化视图的实现机制。而异步CDC根据实现的内部机制区别,又可以分为异步HotLog模式,异步分布式HotLog模式和异步AutoLog模式。

有些模式有固定的预先定义change source,有些则没有。比如同步CDC的change source是SYNC_SOURCE,异步HotLog模式则是HOTLOG_SOURCE,这是因为这两种模式都只有一个source database。而其他的,像异步分布式Hotlog模式和异步AutoLog模式,除了source database,还需要一个staging database。

同步CDC模式

同步CDC模式(Synchronous Mode)通过在源库上建立trigger的方式来捕获增量数据,因此可以做到实时抽取增量数据。当源库执行commit的时候,增量数据将生成在change table中。但是同步CDC模式的缺点也是明显的,由于需要在源库创建trigger,对于源库将造成不小的压力,并且change table也必须在源库中生成,还需要占据源库一定的空间。

同步模式有一个固定的change source:SYNC_SOURCE,表示source database。该change source不能修改也不能删除。
Change Data Capture(一)


异步HotLog模式

异步HotLog模式(Asynchronous HotLog Mode)直接从source database的online redo logfile中抽取增量数据,由于需要解析日志文件,会有一定的时间延迟。change table也必须在源库中生成。该模式由于是在源数据库中解析日志,对源数据库也会造成一定的压力,但是比同步CDC模式的压力要小一些。

异步HotLog模式也有一个固定的change source:HOTLOG_SOURCE,表示source database的当前连接日志文件。不能修改也不能删除。

Change Data Capture(一)


异步分布式HotLog模式

异步分布式HotLog模式(Asynchronous Distributed HotLog Mode)和异步HotLog模式相比,主要是将多个source database的当前联机日志中解析出增量数据,然后传递一个staging database中处理,便于集中式数据管理。

在异步分布式HotLog模式中,change source也表示source database的当前联机日志。但是由于一个staging database可以处理多个源数据库,所以没有预先定义的change source,需要在使用的时候自定义change source。

在该模式中,需要两个发布者。一个在source database中,一个在staging database中。

Change Data Capture(一)


异步Autolog模式

异步Autolog模式(Asynchronous AutoLog Mode)则是先将日志文件从source database传递到staging database,然后在staging database执行日志分析。这样可以将对source database的压力减到最小。日志的传递通过Redo transport services服务来实现,是不是对这个服务名很熟悉?在Data Guard中也是通过该服务将主库的日志传递到备库的,实际上该模式对于日志的处理和Data Guard中基本上是同样的机制。所以这里也需要在source database中设置相应的LOG_ARCHIVE_DEST_n参数来实现日志的传递。

异步AutoLog模式既可以使用联机日志,也可以使用归档日志来获得增量数据信息。

Change Data Capture(一)

Change Data Capture(一)


四、相关系统视图

  • CHANGE_SOURCES
  • CHANGE_PROPAGATIONS
  • CHANGE_PROPAGATION_SETS
  • CHANGE_SETS
  • CHANGE_TABLES
  • DBA_SOURCE_TABLES/ALL_SOURCE_TABLES/USER_SOURCE_TABLES
  • DBA_PUBLISHED_COLUMNS/ALL_PUBLISHED_COLUMNS/USER_PUBLISHED_COLUMNS
  • DBA_SUBSCRIPTIONS/ALL_SUBSCRIPTIONS/USER_SUBSCRIPTIONS
  • DBA_SUBSCRIBED_TABLES/ALL_SUBSCRIBED_TABLES/USER_SUBSCRIBED_TABLES
  • DBA_SUBSCRIBED_COLUMNS/ALL_SUBSCRIBED_COLUMNS/USER_SUBSCRIBED_COLUMNS
  • 9i:DBA_SOURCE_TAB_COLUMNS/ALL_SOURCE_TAB_COLUMNS/USER_SOURCE_TAB_COLUMNS
  • 10g:DBA_PUBLISHED_COLUMNS/ALL_PUBLISHED_COLUMNS/USER_PUBLISHED_COLUMNS