博客园 首页 联系 订阅 管理

经常有客户提出这样的需求:希望能追踪某些表在某个时间段里的所有操作。特别是当一些关键业务表的记录被误删除(或误修改)时,希望能找到罪魁祸首。

在以往遇到这种情况时,我们只能够通过手工执行一些Oracle的命令来实现,而且这些方法都有各自的局限性:

  • 在9i和之前的版本。通过logminer工具分析在线日志或者归档日志。前提是必须保留归档日志。
  • 在10g和之后版本。有两种方式可选,方法一:用logminer工具分析在线日志或离线日志。方法二:用Oracle的Flashback Query技术。前一种方法必须保留日志文件,后者只能查到UNDO_RETENTON以内的数据。

上面的方法除了有这样那样的限制外,在操作上还很复杂,需要对Oracle有一定的了解。

那有没有一种工具能记录下某张表上的所有变更呢,执行指定时间段,就能查到这段时间内的该表的所有变更呢?

Quest SharePlex的最新版本Version 7.6.3中引入了一个新的特性:Change Tracking。这个新特性可以捕获源库中指定表的所有表更,并存储数据库中。

对于一条记录的每一个变更,SharePlex都会将事务的user id、时间戳、SCN、源记录的row id、key values、事务id、操作类型以及发生表更的字段数值等。对于update操作,SharePlex还会将字段列表更后的数值记录下来。

设置Change Tracking功能:

1.在目标端设置参数SP_OPO_TRACK_CHANGES,注:这是一个post进程参数,也可以设置指定的Post进程。

2.参照源端的表结构在目标端创建相应的目标表,注:不要创建约束条件,因为因为NOT NULL的约束条件会导致Post进程失败。

3.在目标端执行脚本optdir/util/add_change_tracking_columns.sql,在目标表上增加user id、timestamp等字段。

运行脚本 add_change_tracking_columns后,目标表上会增加一些新的字段:

SHAREPLEX_SOURCE_TIME VARCHAR2(20)

SHAREPLEX_SOURCE_USERID NUMBER

SHAREPLEX_SOURCE_OPERATION VARCHAR2(20)

SHAREPLEX_SOURCE_SCN NUMBER

SHAREPLEX_SOURCE_ROWID ROWID

SHAREPLEX_SOURCE_TRANS VARCHAR2(60)

SHAREPLEX_OPERATION_SEQ NUMBER

其中:

SHAREPLEX_SOURCE_TIME 表示变更操作在源端发生的时间。

SHAREPLEX_SOURCE_USERID 表示在源库中执行变更的用户。

SHAREPLEX_SOURCE_OPERATION 表示变更的类型,共有6类:

INSERT

UPDATE

DELETE

COMMIT

TRUNCATE

DROP COLUMN

注: 是否记录COMMIT操作,由参数SP_OPO_TRACK_COMMITS来控制,该参数的缺省值为0,表示不记录COMMIT操作;设置为1表示记录COMMIT操作。

SHAREPLEX_SOURCE_SCN表示源库的SCN。

SHAREPLEX_SOURCE_ROWID表示该记录在源库的rowid。

SHAREPLEX_SOURCE_TRANS表示该变更所在事务的id。

SHAREPLEX_OPERATION_SEQ表示同一个事务中不同变更的顺序号。

 

使用Change Tracking功能时应注意以下事项:

  1. 参数SP_OPO_TRACK_CHANGES的修改必须要重启POST进程才能生效。
  2. 目标表不能有任何约束条件,如主键约束、唯一键约束、非空约束、检查约束、缺省值等。
  3. 只有ALTER TABLE ADD and ALTER TABLE MODIFY DDL操作会被复制到目标表中。
  4. 缺省不记录COMMIT操作,控制开关为参数SP_OPO_TRACK_COMMITS。
  5. 源表中UDT和VARRAY字段的变更不能被记录。

 

其他注意事项:

• If a DBMS_LOB operation is used to change a part of the LOB column, the value stored for that column on the target will not be the complete LOB column

• Compare will fail with an unsupported message

• Do NOT issue the copy command as it does not detect that the target table is a change tracking table and will copy the source to the target

• Auto-add and change-tracking are not compatible and cannot be used on the same instance. Auto-add replicates create table ddl and applies it to the target, while change tracking ignores the create table ddl.