|
本帖最后由 sundog315 于 2011-10-31 16:18 编辑
电梯
Oracle技术嘉年华的一个案例,redo的那些事,连载二
Oracle技术嘉年华的一个案例,redo的那些事,连载三
在刚刚结束的Oracle技术嘉年华大会上,eygle大师的演讲中提到了有关于数据安全的一个案例,大致的意思是数据库管理员修改了自己账户的金额。但是,奇怪的是,通过logminer挖掘日志时,居然挖掘不到修改记录,显示如下状况:
SQL_REDO的内容是Unsupported,但是,通过logfile dump,可以看到此次修改,如下图:
将金额从0修改为40000。
在大会上,主要讨论的是数据安全方面的议题,但是,我确感到很奇怪,为什么此处的redo记录Oracle的logminer居然无法解析呢?
于是,管eygle大师要来了这部分的归档日志,决定一探究竟。
拿到日志以后,首先看了一下日志头信息,在第二个512字节的块里,有一些系统的信息:
可以看到,这个数据库的compatible参数设置的是9.2.0,应该是一个9i的库,这个系统应该是big endian的系统,猜测应是AIX。在AIX上先logminer一下,看看到底是什么情况:
SQL> begin
dbms_logmnr.add_logfile('/1_12446.dbf');
end;
/
PL/SQL procedure successfully completed.
SQL> begin
dbms_logmnr.start_logmnr();
end;
/
PL/SQL procedure successfully completed.
SQL> select t.RBABLK,t.RBABYTE,t.DATA_OBJ#,t.ROW_ID,t.OPERATION,t.SQL_REDO,t.INFO from v$logmnr_contents t where t.RBABLK=166733;
166733 16 66237 AAAQXKAAAAAAAAAAAA UNSUPPORTED Unsupported Object or Data type Unsupported
依然是Unsupported,INFO中显示Object or Data type Unsupported,并且,ROWID也很奇怪,这个ROWID根本不是一个有效的ROWID
Oracle的log miner工具是不支持一些情况的,例如:
1) Simple and nested abstract datatypes (ADTs)
2) Collections (nested tables and VARRAYs)
3) Object Refs
4) Index organized tables (IOTs)
5) CREATE TABLE AS SELECT of a table with a clustered key
第5条明显不满足,所以,首先怀疑这个表是否有特殊字段。
于是,又骚扰了一下eygle大师,不久,便有了回音,没有特殊的字段,都是标准的类型,看来不是这个原因,metalink了一下,有一个文章符合这种情况:
UNSUPPORTED Value In Sql_redo,Operation Columns Of V$Logmnr_contents [ID 282994.1]
Cause
Logminer cannot always populate all the fields of the v$logmnr_contents this is because the redo may/may not have all the information that we need for every column. Fix
Enable supplemental logging on the database
Oracle认为这种情况不是个BUG,当打开附加日志时,将得到足够的信息, logminer也就能够正确的得到SQL结果。
|
|