posts - 42,comments - 83,trackbacks - 0
                  有些時(shí)候(比如用戶無刪除某些數(shù)據(jù),但又沒有備份),我們可能需要分析redo log中的transaction情況,比如提交時(shí)間、事務(wù)內(nèi)容等,這樣我們可以通過LogMiner的結(jié)果,來重新提交這些事務(wù),以保證數(shù)據(jù)不會(huì)丟失。下面是如何通過LogMiner查看redo中事務(wù)日志的具體步驟,

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

          2:生成數(shù)據(jù)字典信息(這一步對(duì)于source database 和mining database為同一database的情況時(shí)不需要的,我們可以使用online catalog字典,字典信息在start logMiner的時(shí)候指定),注意,要執(zhí)行下面的sql, 我們首先需要把db的utl_file_dir修改為D:\oracle\admin\TestDB\utl_file_dir,如何修改這個(gè)參數(shù),可以參考 http://www.aygfsteel.com/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);
          這個(gè)過程因?yàn)橐?0M/27M(9i/10.2)的字典文件,執(zhí)行時(shí)間可能需要2-3分鐘。
          字典信息用于將redo log中的對(duì)象標(biāo)識(shí)(id)翻譯成用戶可讀的信息。如果沒有字典信息,insert into test values('fjin')將被翻譯成如下信息:

          insert into "UNKNOWN"."OBJ# 30347"("COL 1") values (HEXTORAW('666a696e'));
          根據(jù)字典信息解釋出來的sql為:
          insert into "SYSTEM"."TEST"("ADDR") values ('fjin');


          3:添加需要分析的日志文件(可以是inactive的,也可以使active的),如果需要使用當(dāng)前active的,我們可以通過下面的sql查看當(dāng)前的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


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

          4:?jiǎn)?dòng)logMiner,
          SQL> exec dbms_logmnr.start_logmnr( options => dbms_logmnr.dict_from_online_catalog);

          5:根據(jù)指定的條件分析日志,
          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發(fā)現(xiàn)和該紀(jì)錄相關(guān)的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:結(jié)束logMiner,
          SQL>EXEC DBMS_LOGMNR.END_LOGMNR();

              這里只是給出了個(gè)大概步驟,具體的參數(shù)(5中的query condition),需要我們?cè)敿?xì)參考o(jì)racle的Oracle Database Utilities,以便根迅捷的定位出具體我們需要的信息。

          注意:對(duì)于Oracle 10g,默認(rèn)情況下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,我們必須修改如下的參數(shù),
          SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA 
          參數(shù)修改后的redo log才會(huì)紀(jì)錄LogMiner需要的信息。參考note110301.1


          posted on 2009-06-09 13:39 走走停停又三年 閱讀(2064) 評(píng)論(0)  編輯  收藏 所屬分類: Database
          主站蜘蛛池模板: 大庆市| 昂仁县| 定襄县| 沧源| 维西| 新巴尔虎左旗| 石狮市| 淄博市| 尉犁县| 清水河县| 尼木县| 兰溪市| 渑池县| 彝良县| 渝北区| 随州市| 丹寨县| 汤阴县| 五莲县| 高要市| 昆山市| 乌拉特中旗| 嵊泗县| 陈巴尔虎旗| 科技| 大悟县| 临猗县| 得荣县| 林甸县| 郁南县| 顺平县| 永福县| 唐海县| 夏邑县| 神木县| 宽城| 青阳县| 剑阁县| 兴海县| 玉屏| 佛教|