LogMiner的應(yīng)用實(shí)例
?
??? 從安裝開始,了解一遍LogMiner的實(shí)際使用方法。有了這個,基本上LogMiner就沒什么難度了,照著一模一樣做一遍就學(xué)會了,呵呵。
?
一、安裝LogMiner
?
??? 1、創(chuàng)建DBMS_LOGMNR包
??????? @D:\oracle\ora92\rdbms\admin\dbmslm.sql;
?
??????? --指定日志文件名
??????? --指定篩選標(biāo)準(zhǔn)
??????? --確定LodMiner會話特性
?
??? 2、創(chuàng)建DBMS_LOGMNR_D包
??????? @D:\oracle\ora92\rdbms\admin\dbmslmd.sql;
?
??????? --該包用來創(chuàng)建數(shù)據(jù)字典文件
??????? --查詢當(dāng)前數(shù)據(jù)庫的字典表
?
?
二、提取字典
?
??? 1、提取到平面文件
?
??? 必須在啟動文件中指定UTL_FILE_DIR參數(shù),以放置字典文件的目錄
?
??? 執(zhí)行 DBMS_LOGMNR_D.BUILD('dictionary.ora',
'D:/oracle/logminer',
options => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
來創(chuàng)建平面文件
?
??? < 注:不加STORE_IN_FLAT_FILE也可,因?yàn)橛械刂返哪J(rèn)均是FLAT_FILE >
?
??? 2、提取到重做日志文件
?
??? DBMS_LOGMNR_D.BUILD(options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
?
??? < 注:要提取到重做日志文件時,數(shù)據(jù)庫必須要運(yùn)行在ARCHIVELOG模式下 >
?
?
三、指定要分析的重做日志文件
?
??? 1、通過NEW來創(chuàng)建重做日志文件的列表
?
??????? DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => 'D:\oracle\oradata\kaka\redo01.log', options => DBMS_LOGMNR.NEW);
??????? --若再次NEW時,則前面的記錄全部丟棄
?
??? 2、通過ADDFILE來添加更多的重做日志文件
?
??????? DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => 'D:\oracle\oradata\kaka\redo02.log', options => DBMS_LOGMNR.ADDFILE);
?
??? 3、通過REMOVEFILE來刪除列表中的重做日志文件
?
??????? DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => 'D:\oracle\oradata\kaka\redo02.log', options => DBMS_LOGMNR.REMOVEFILE);
?
?
四、啟動LogMiner
?
??? 使用DBMS_LOGMNR.START_LOGMNR()來啟動LogMiner
?
??? 1、指定數(shù)據(jù)字典
?
??????? DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => 'D:/oracle/logminer/dictionary.ora');
?
??????? 重做日志:DICT_FROM_REDO_LOGS
??????? 聯(lián)機(jī)字典:DICT_FROM_ONLINE_CATALOG
?
??? 2、可以指定時間篩選
?
??????? DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => 'D:/oracle/logminer/dictionary.ora', STARTTIME => TO_DATE('2008-12-15 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), ENDTIME => TO_DATE('2008-12-15 17:30:00', 'YYYY-MM-DD HH24:MI:SS'));
?
??? 3、使用SCN判斷時間
?
??????? DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => 'D:/oracle/logminer/dictionary.ora', STARTSCN => 100, ENDSCN => 150);
?
??? 4、使用OPTIONS參數(shù)設(shè)置以下特性:
?
??????? ① COMMITTED_DATA_ONLY:只顯示已提交事務(wù)的行
??????????? 這個特性可以篩選出回滾事務(wù)以及進(jìn)程中事務(wù),但是若事務(wù)長時間運(yùn)行,將引起“Out of Memory”錯誤
?
??????? ② SKIP_CORRUPTION:跳過重做日志損壞的地方
??????????? 對于每個受損壞的記錄,都會返回一行信息指出跳過多少塊,若第1個信息就損壞則中斷操作
?
??????? ③ DDL_DICT_TRACKING:使用平面/重做日志數(shù)據(jù)字典時保持更新
??????????? 確保了SQL_REDO和SQL_UNDO的正確性,但對于DICT_FROM_RESET_ONSELECT無效
?
??????? ④ NO_DICT_RESET_ONSELECT:在查詢V$LOGMNR_CONTENTS時避免重載數(shù)據(jù)字典
??????????? 這個指令與DDL_DICT_TRACKING正好相反,但是優(yōu)先級大于DDL_DICT_TRACKING
?
??????? ⑤ DICT_FROM_ONLINE_CATALOG:采用數(shù)據(jù)庫當(dāng)前使用的字典
??????????? 這個指令優(yōu)先級小于DDL_DICT_TRACKING,若設(shè)置了那個則這個無效
?
??????? ⑥ DICT_FROM_REDO_LOGS:在重做日志文件列表中找到一個字典
??????????? 這個特性有利于分析某一特定時間內(nèi)的數(shù)據(jù)
?
??????? 多個特性列表的舉例:
??????? DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DDL_DICT_TRACKING + DBMS_LOGMNR.NODICT_RESET_ONSELECT + ...);
?
?
五、分析V$LOGMNR_CONTENTS的輸出
?
??? 使用SQL查詢V$LOGMNR_CONTENTS視圖,會從重做日志文件中依次獲得記錄返回,直到滿足啟動時指定的篩選標(biāo)準(zhǔn),或重做日志結(jié)束。
除非使用了COMMITTED_DATA_ONLY,否則LogMiner將按SCN返回所有行。
?
??? 舉例說明SELECT V$LOGMNR_CONTENTS的性質(zhì):
?
??? 第一次查詢:SELECT SQL_REDO FROM V$LOGMNR_CONTENTS;
??? SQL_REDO
??? -----------------------------------------------------------------------------------------------
??? create table scott.t1(id int,name varchar2(30),mark varchar2(100));
??? insert into "SCOTT"."T1"("ID","NAME","MARK") vlues (10,'bob','aaaaa');
??? insert into "SCOTT"."T1"("ID","NAME","MARK") vlues (11,'tom','bbbbb');
??? commit;
??? alter table scott.t1 drop(mark);
??? insert into "SCOTT"."T1"("ID","NAME") vlues (12,'jac');
??? commit;
?
??? 此時在內(nèi)部的數(shù)據(jù)字典中,由于執(zhí)行了drop,內(nèi)部字典已經(jīng)沒有了mark列,若設(shè)置了NO_DICT_RESET_ONSELECT,則會出現(xiàn)以下情況:
?
??? 第二次查詢:SELECT SQL_REDO FROM V$LOGMNR_CONTENTS;
??? SQL_REDO
??? -----------------------------------------------------------------------------------------------
??? create table scott.t1(id int,name varchar2(30),mark varchar2(100));
??? insert into "SCOTT"."T1"("COL 1","COL 2","COL 3") vlues (HEXTORAW('78fes78r'),HEXTORAW('vtf43tf4'),HEXTORAW('32f4eff8'));
??? insert into "SCOTT"."T1"("COL 1","COL 2","COL 3") vlues (HEXTORAW('4gf3revw'),HEXTORAW('32frdsf3'),HEXTORAW('b432cer3'));
??? commit;
??? alter table scott.t1 drop(mark);
??? insert into "SCOTT"."T1"("ID","NAME") vlues (12,'jac');
??? commit;
?
??? 前面兩個insert語句因?yàn)樽值渲腥鄙倭薽ark列,所以要使用COL 和 HEXTORAW
?
??? 所以:若需要多次查詢,則不可以設(shè)置NO_DICT_RESET_ONSELECT
?
?
六、結(jié)束LogMiner
?
??? DBMS_LOGMNR.END_LOGMNR;
?
??? ① 當(dāng)使用該語句時,將關(guān)閉所有日志文件,并釋放所有LogMiner分配的數(shù)據(jù)庫和系統(tǒng)資源。
?
??? ② 若沒有使用該語句,則會保持分配的資源直到啟動LogMiner的會話結(jié)束。
?
??? ③ 若使用了DDL_DICT_TRACKING或DICT_FROM_REDO_LOGS選項(xiàng),則務(wù)必要使用該語句,否則會造成系統(tǒng)資源的浪費(fèi)。
?
?
?