数据库增量数据采集(Change Data Capture)概略

数据采集通常是指ETL过程中Extract-数据抽取部分。除了ETL外在不同应用系统之间通常也需要传递数据,在某些环境条件限制下不能将数据从一个系统直接移到另一个系统,只能借助文本来作为中间媒介传递数据,且文本的生成有时间窗口的限制,所以对数据采集即数据抽取的性能有一定的要求。对增加数据的采集的方法常用的有以下几种:

1.时间戳(Timestamps on rows)

在表中增加一列通常为Last_update列来存储当前行最后一次进行DML操作的时间。时间戳大于最后一次采集(capture)时间的数据是待采集的数据即最后一次采集后有变化的数据。

2.版本号(Version Numbers on rows)

在表中增加一列通常为Version_number列来存储数据行变化,每次变化都将version_number列的数据增加;然后可以使用一个参考表来记录每次采集时数据对应的版本号,当再次采集时将参考表与源表中的版本号比较来判断需要采集的数据,采集完以后将参考表中对应版本号更新为与源表一致的版本号;

3.状态指示(Status indicators on rows)

在表中增加一列状态列通常为Status列来存储数据行状态,比如如果当前行需要采集则将其致为true,否则为false;采集时只需要采集状态为true的行即可;

4.时间戳、版本号、状态指示混合使用(Time/Version/Status on rows)

在如下逻辑下可以混合使用,比如需要采集2011年1月2日12:15到2011年2月4日10:00之间版本号为2.1状态的数据;

5.触发器 (Triggers on tables)

在表上增加触发器,当表中数据有变化时指示触发器将变化的数据写入另外的变化记录表中,采集时只需要将变化记录表中的数据导出即可;

6.数据库的日志扫描(Log scanners on databases)

数据库的日志文件中记录数据的每次变化,扫描日志文件可以查看数据库表的变化情况。但各数据库通常不对外开放其数据库日志的具体格式,所以大多数情况只能使用由数据库厂商提供的日志扫描工具来查看数据变化情况。当前市场上这类成型的产品有:

  • Attunity Stream
  • DatabaseSync from WisdomForce
  • Golden Gate Transactional Data Integration
  • HVR from HVR Software
  • DBMoto from HiT Software
  • Shadowbase from Gravic
  • IBM InfoSphere Change Data Capture (previously DataMirror Transformation Server)
  • Informatica PowerExchange CDC Option (previously Striva)
  • Oracle Streams[1]
  • Oracle Data Guard[2]
  • Replicate1 from Vision Solutions
  • SharePlex from Quest Software
  • oracle CDC详细文档可参考:

    lOracle Data Warehousing Guide, 10gR1, Chapter 16

    lOracle PL/SQL Packages and Types Reference, 10gR1, packages DBMS_CDC_*

    lhttp://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_bi.html

    lhttp://www.oracle.com/technology/products/bi/db/10g/pdf/twp_dss_ontime_etl_10gr1_0304.pdf

    lhttp://www.rittman.net/archives/000901.html

    lhttp://www.nyoug.org/cdc.pdf

7.表差异(Table differencing)

根据表不同的时候的差异来选择增量数据,比如使用如下sql语句来选择:

SELECT * FROM old_version
MINUS SELECT * FROM new_version;

参考:http://en.wikipedia.org/wiki/Change_data_capture

你可能感兴趣的:(数据库增量数据采集(Change Data Capture)概略)