网上有一个问题, 要想知道那些表记录发生了变化? 对于一些更新不是很多(一秒种有几百条上下的)的表, 我会建议用实体化视图日志(Materialize View Log/Snapshot Log)去实现. 其基本原理是能过一个内部(Internal)的内核(Kernal)一级的行级触发器(Row Level Trigger), 将变化过的记录的ROWID或主键值保存到另一个表中去. 实体化视图的增量刷新(Fast Refresh)正是基于这个技术.

    假设我们需要监控的表名为T_OBJECTS, 主键为OBJECT_ID, 如果没有主键则用ROWID, 则可以用如下语句来创建实体化视图日志.

-- Using Primary Key
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS
  TABLESPACE users WITH PRIMARY KEY, SEQUENCE;

-- Using ROWID
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS
  TABLESPACE users WITH ROWID, SEQUENCE;

    这时会在Oracle中生成一个MLOG$_T_OBJECTS的表, 包含如下有用字段:

SEQUENCE$$ -- Operation Order
DMLTYPE$$  -- Operation Type, U=Update/I=Insert/D=Delete
M_ROW$$    -- ROWID of affected row,
OBJECT_ID  -- The primary key values in this case

    我用ROWID类型的做了实验, 先做了一条Insert, 再做了一条Delete, 然后查询日志表记录:

SQL> SELECT SEQUENCE$$, M_ROW$$, DMLTYPE$$ FROM MLOG$_T_OBJECTS;

SEQUENCE$$ M_ROW$$              D
---------- -------------------- -
         1 AAACYhAAEAAAEFvAAA   I
         2 AAACYhAAEAAACOMAAA   D

    更复杂的例子就自已去设计了. 如果搞懂了这些, 还可以自已写角本从Oracle向其他的数据库进行数据复制呢.