2007年11月20日
logminer應用(查尋所操作過的sql語法)
前言:
| 在操作logmnr之前先提一下redo log file的作用,redo log file 主要是用來存放執行中、執行後的sql指令,所以在redo log裏可查到 1、資料改變的記錄 (insert / update / delete / ddl的動作) 2、scn值 3、commit_scn 4、owner、table name 5、redo、undo的sql語法等等 |
重要的view有
| V$LOGMNR_CONTENTS : 存放我們解譯後的sql (注意,當我們離開這個session後,裏面的資料將會自動清除) V$LOGMNR_DICTIONARY :如是使用字典檔時,這裏會有一筆資料;字典檔的用處主要是用於反解譯oracle的語言成我們所明了的文字,存放oracle內部的資料都是編碼過的, 如 insert into Object#2581(col#1, col#2) values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));",這種東西對我們來說是很難了解的,所以我們如要 看到類似INSERT INTO emp(name, salary) VALUES ('John Doe', 50000); 這種描述的話,就需要字典檔來幫忙了 V$LOGMNR_LOGFILE:記錄被分析的檔案明細 V$LOGMNR_LOGS Synonym for V_$LOGMNR_LOGS |
可使用的方式大致上分成2類
1、不需要建立字典
| 簡單說一下測試流程 1: 新增幾筆資料或刪除幾筆資料 2: execute dbms_logmnr.add_logfile(LogFileName => '/u01/app/oracle/oradata/binhu/redo03.log',Options => dbms_logmnr.NEW); (將現在使用的redo log 加進分析清單中,第一個檔要使用new) execute dbms_logmnr.add_logfile(LogFileName => '/u01/app/oracle/oradata/binhu/redo02.log',Options => dbms_logmnr.ADDFILE); (如你要再加入別的檔的話,就要使用addfile了) 3: execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG); (進行分析) 4:select v$logmnr_contents (查尋相關的資料) 細步操作如下: 1、先建立一些測試用的資料 SQL> create table test_log (id number,id2 number) tablespace tbs; 2、查一下現在用的redo log file是那一個(最好看一下alter log檔裏是否在上列操作中有產生archive的動作) SQL> execute dbms_logmnr.add_logfile(LogFileName => '/u01/app/oracle/oradata/binhu/redo03.log',Options => dbms_logmnr.NEW); SQL> select scn,cscn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo,sql_undo from v$logmnr_contents where SQL_REDO like '%TEST_LOG%'; 10、我們也可查尋一個範圍,就可看到 commit 的scn值了,就可由這樣子做到精準點的還原 select * from v$logmnr_contents where scn between 1612491 and 1612590; |
如要分析的是archive log 檔呢,其實方法就跟上列相同,只是加入的檔案指到archive log檔而已
| 簡單說一下測試流程 1: insert / update / delete 資料 2: alter system archive log current; (產生 archive log 檔) 3:execute dbms_logmnr.add_logfile(logfilename=>'/xxxxxx',options=>dbms_logmnr.new); (xxxxx : 為你的archive log 檔) 4:execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.direct_form_redo_logs); (採用的分析方法) 5:select v$logmnr_contents; (查看是否真的存在) 細步操作如下: 1、建立幾測試資料 |
2、使用字典檔
什情況需要用到字典檔,我們可以想一下第1種方式應該是直接讀取oracle內部的字典檔,如我們刪除了一個tablespace、datafile後,相對 而言oracle也會刪除在字典檔裏對應的資料,這時我們再去分析archive log檔時,就無法反解譯成我們了解的語言了,所以使用字典檔的方法還是有必要存在的,所以當做了重大的改變時,可考慮是否把字典檔給保留一份,以利往後 的需求
測試流程我共有二類,最大的差別是其中一種需要重開機,另一種是把字典檔存在archive log 檔中
把字典檔存在archive log檔中的操作流程:
| 1、先清除一下環境 SQL> alter system switch logfile; SQL> alter system archive log current; 2、產生字典檔 SQL> execute dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); 3、查看一下所以有的字典檔清單 (只要取其中一份,我是取最新的日期的檔案 1_118.dbf) SQL> select al.NAME from v$archived_log al where dictionary_begin = 'YES'; NAME -------------------------------------------------------------------------------- /u01/arch/1_107.dbf /u01/arch/1_109.dbf /u01/arch/1_113.dbf /u01/arch/1_118.dbf SQL> select al.NAME from v$archived_log al where dictionary_end = 'YES'; NAME -------------------------------------------------------------------------------- /u01/arch/1_107.dbf /u01/arch/1_109.dbf /u01/arch/1_113.dbf /u01/arch/1_118.dbf 4、先把字典檔給加進去 SQL> execute dbms_logmnr.add_logfile(LogFileName => '/u01/arch/1_118.dbf',Options => dbms_logmnr.NEW); 5、增加一些測試資料跟產生archive log 檔 SQL> insert into test3 values (10); SQL> insert into test3 values (11); SQL> commit; SQL> insert into test3 values (12); SQL> insert into test3 values (13); SQL> commit; SQL> insert into test3 values (14); SQL> insert into test3 values (15); SQL> insert into test3 values (16); SQL> insert into test3 values (17); SQL> commit; SQL> alter system archive log current; SQL> alter system switch logfile; 6、把產生的archive log 檔加入分析清單中 SQL> execute dbms_logmnr.add_logfile(LogFileName => '/u01/arch/1_119.dbf',Options => dbms_logmnr.ADDFILE); SQL> execute dbms_logmnr.add_logfile(LogFileName => '/u01/arch/1_120.dbf',Options => dbms_logmnr.ADDFILE); 7、進行分析時的字典檔,指定為archive log 檔裏的字典檔 SQL> execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.DICT_FROM_REDO_LOGS); 8、查看一下分析檔案清單 SQL> select filename from v$logmnr_logfile; FILENAME -------------------------------------------------------------------------------- /u01/arch/1_118.dbf /u01/arch/1_119.dbf /u01/arch/1_120.dbf SQL> select sql_redo from v$logmnr_contents where sql_redo like '%TEST3%'; SQL_REDO -------------------------------------------------------------------------------- insert into "SYS"."LOGMNRG_OBJ$"("OBJV#","OWNER#","NAME","NAMESPACE","SUBNAME"," insert into "SYS"."TEST3"("ID") values ('10'); insert into "SYS"."TEST3"("ID") values ('11'); insert into "SYS"."TEST3"("ID") values ('12'); insert into "SYS"."TEST3"("ID") values ('13'); insert into "SYS"."TEST3"("ID") values ('14'); insert into "SYS"."TEST3"("ID") values ('15'); insert into "SYS"."TEST3"("ID") values ('16'); insert into "SYS"."TEST3"("ID") values ('17'); 確時有找到 |
另一種就要重起db了,在7x24真實環境中,除非有先設定好,不然應該是不會採用這個種方法
操作流程請參考 http://blog.roodo.com/mywork/archives/3468629.html
重點:
1、採用第二種方式分析,db需要在archivelog mode