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

在以往遇到这种情况时,我们只能够通过手工执行一些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操作。
Note: The COMMIT record will only be written to the target table if the parameter SP_OPO_TRACK_COMMITS parameter is set to 1. The parameter is set to 0 by default.
 
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.