如何通过log miner来分析redo log中的transaction

如何通过log miner来分析redo log中的transaction
        有些时候(比如用户无删除某些数据,但又没有备份),我们可能需要分析redo log中的transaction情况,比如提交时间、事务内容等,这样我们可以通过LogMiner的结果,来重新提交这些事务,以保证数据不会丢失。下面是如何通过LogMiner查看redo中事务日志的具体步骤,

1:以sysdba连接上db instance,
SQL> connect system/coffee@testdb as sysdba
Connected.

2:生成数据字典信息(这一步对于source database 和mining database为同一database的情况时不需要的,我们可以使用online catalog字典,字典信息在start logMiner的时候指定),注意,要执行下面的sql, 我们首先需要把db的utl_file_dir修改为D:\oracle\admin\TestDB\utl_file_dir,如何修改这个参数,可以参考 http://www.blogjava.net/fjin/archive/2009/06/08/280666.html
SQL> exec dbms_logmnr_d.build('dictionary.ora','D:\oracle\admin\TestDB\utl_file_dir', options =>dbms_logmnr_d.store_in_flat_file);
这个过程因为要生成10M/27M(9i/10.2)的字典文件,执行时间可能需要2-3分钟。
字典信息用于将redo log中的对象标识(id)翻译成用户可读的信息。如果没有字典信息,insert into test values('fjin')将被翻译成如下信息:

insert into "UNKNOWN"."OBJ# 30347"("COL 1") values (HEXTORAW('666a696e'));
根据字典信息解释出来的sql为:
insert into "SYSTEM"."TEST"("ADDR") values ('fjin');


3:添加需要分析的日志文件(可以是inactive的,也可以使active的),如果需要使用当前active的,我们可以通过下面的sql查看当前的redo log,

SQL> col status format A10
SQL> col member format A40
SQL> select log.status, logfile.member
  2  from v$log log, v$logfile logfile
  3  where log.group#=logfile.group#;

STATUS     MEMBER
---------- ----------------------------------------
CURRENT    D:\ORACLE\ORADATA\TESTDB\REDO01.LOG
INACTIVE   D:\ORACLE\ORADATA\TESTDB\REDO02.LOG
INACTIVE   D:\ORACLE\ORADATA\TESTDB\REDO03.LOG


好了,我们看到当前的日志文件是REDO01.LOG,把它加入到logMiner中来
SQL> exec dbms_logmnr.add_logfile( logfilename => 'D:\oracle\oradata\TestDB\redo01.log', options => dbms_logmnr.new);

4:启动logMiner,
SQL> exec dbms_logmnr.start_logmnr( options => dbms_logmnr.dict_from_online_catalog);

5:根据指定的条件分析日志,
SQL> col sql_redo format a30
SQL> col xid format A10
SQL> col usr format A10
SQL> SELECT USERNAME AS usr,(XIDUSN || '.' || XIDSLT || '.' || XIDSQN) as XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE username='SYSTEM';
我们可以通过sqlplus插入一条记录,如下:

SQL> insert into test values('fjin');
1 row created.
SQL> commit;
Commit complete.

插入这条记录后,我们可以在通过logMiner发现和该纪录相关的transaction信息如下:

SYSTEM     5.26.26758 set transaction read write;
SYSTEM     5.26.26758 insert into "SYSTEM"."TEST"("ADDR") values ('fjin');
SYSTEM     5.26.26758 commit;


6:结束logMiner,
SQL>EXEC DBMS_LOGMNR.END_LOGMNR();

    这里只是给出了个大概步骤,具体的参数(5中的query condition),需要我们详细参考oracle的Oracle Database Utilities,以便根迅捷的定位出具体我们需要的信息。

注意:对于Oracle 10g,默认情况下LogMiner是不可用的,原文如下:
"By default, Oracle Database does not provide any supplemental logging, which means that by default LogMiner is not usable. Therefore, you must enable at least minimal supplemental logging prior to generating log files which will be analyzed by LogMiner."
所以,要在10g上使用LogMiner,我们必须修改如下的参数,
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA 
参数修改后的redo log才会纪录LogMiner需要的信息。参考note110301.1


你可能感兴趣的:(如何通过log miner来分析redo log中的transaction)