LogMiner学习笔记
生活随笔
收集整理的這篇文章主要介紹了
LogMiner学习笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
LogMiner學(xué)習(xí)筆記
LogMiner的基本介紹
所有對用戶數(shù)據(jù)和數(shù)據(jù)字典的改變都記錄在Oracle的Redo Log中,因此,
redo log包含了所有進(jìn)行恢復(fù)操作所需要的信息。利用這些數(shù)據(jù),DBA可以:
?? ? ? 在應(yīng)用級別上,發(fā)現(xiàn)發(fā)生于數(shù)據(jù)庫上的邏輯錯誤。例如錯誤地Update了
某個表中的全部記錄。
?? ? ? 發(fā)現(xiàn)用戶的誤操作。
?? ? ? 確定如何在事務(wù)級別上進(jìn)行最精細(xì)的還原操作。
?? ? ? 通過趨向分析,進(jìn)行數(shù)據(jù)庫的調(diào)優(yōu)和規(guī)劃。
?? ? ? 進(jìn)行崗位審計。
Oracle公司通過LogMiner提供了訪問redo log的SQL,其是Oracle數(shù)據(jù)庫
服務(wù)器的一部分。LogMiner通過V$LOGMNR_CONTENTS視圖顯示redo log中
的信息。這個視圖中保存著與對數(shù)據(jù)庫的改變有關(guān)的歷史信息,包含,但不局限
于,下列信息:
?? ? ? 數(shù)據(jù)庫的改變的類型(Insert、Update、Delete或者是DDL)
?? ? ? 發(fā)生變化時的SCN
?? ? ? 變化被提交時的SCN
?? ? ? 該變化屬于那個事務(wù)
?? ? ? 所修改的對象的表名和方案名
?? ? ? 提交了該DDL或DML語句的用戶信息
?? ? ? 重建的SQL語句,其示出了回滾UNDO該變化所需的SQL語句。
Oracle 9i提供的LogMiner的增強(qiáng)特性
1、支持更多數(shù)據(jù)/存儲類型:鏈接/遷移行、CLUSTER表操作、DIRECT PATH
插入以及DDL操作。在V$LOGMNR_CONTENTS的SQL_REDO中可以看到
DDL操作的原句(CREATE USER除外,其中的密碼將以加密的形式出現(xiàn),而
不是原始密碼)。如果TX_AUDITING初始化參數(shù)設(shè)為TRUE,則所有操作的數(shù)
據(jù)庫賬號將被記錄。?
2、提取和使用數(shù)據(jù)字典的選項:現(xiàn)在數(shù)據(jù)字典不僅可以提取到一個外部文
件中,還可以直接提取到重做日志流中,它在日志流中提供了操作當(dāng)時的數(shù)據(jù)字
典快照,這樣就可以實現(xiàn)離線分析。?
3、允許對DML操作按事務(wù)進(jìn)行分組:可以在START_LOGMNR()中設(shè)置
COMMITTED_DATA_ONLY選項,實現(xiàn)對DML操作的分組,這樣將按SCN的
順序返回已經(jīng)提交的事務(wù)。?
4、支持SCHEMA的變化:在數(shù)據(jù)庫打開的狀態(tài)下,如果使用了LogMiner
的DDL_DICT_TRACKING選項,Oracle9i的LogMiner將自動對比最初的日志
流和當(dāng)前系統(tǒng)的數(shù)據(jù)字典,并返回正確的DDL語句,并且會自動偵察并標(biāo)記當(dāng)
前數(shù)據(jù)字典和最初日志流之間的差別,這樣即使最初日志流中所涉及的表已經(jīng)被
更改或者根本已經(jīng)不存在,LogMiner同樣會返回正確的DDL語句。?
5、在日志中記錄更多列信息的能力:例如對于UPDATE操作不僅會記錄被
更新行的情況,還可以捕捉更多前影信息。?
6、支持基于數(shù)值的查詢:Oracle9i LogMiner在支持原有基于元數(shù)據(jù)(操作、
對象等)查詢的基礎(chǔ)上,開始支持基于實際涉及到的數(shù)據(jù)的查詢。例如涉及一個
工資表,現(xiàn)在我們可以很容易地查出員工工資由1000變成2000的原始更新語句,
而在之前我們只能選出所有的更新語句。
Redo log使用內(nèi)部產(chǎn)生的數(shù)字化標(biāo)識符來標(biāo)識表和其相關(guān)的列,為了重建
SQL語句,LogMiner需要知道內(nèi)部標(biāo)識符和用戶定義的名稱之間的映射關(guān)系。
這一映射關(guān)系存儲在一個數(shù)據(jù)字典(Dictionary)中。LogMiner提供了一個程序
(DBMS_LOGMNR_D.BUILD)來提取該數(shù)據(jù)字典。
LogMiner的基本組成
LogMiner包含兩個PL/SQL包和幾個視圖:?
1、dbms_logmnr_d包,包括一個用于提取數(shù)據(jù)字典信息的過程,即
dbms_logmnr_d.build()過程。 還包含一個重建LogMiner表的過程,
dbms_logmnr_d.SET_TABLESPACE,默認(rèn)情況下,LogMiner的表是建在SYSTEM表
空間下的。
2、dbms_logmnr包,它有三個過程:?
add_logfile(name varchar2, options number) - 用來添加/刪除用于分析的日志
文件;?
start_logmnr(start_scn number, end_scn number, start_time number,end_time?
number, dictfilename varchar2, options number) - 用來開啟日志分析,同時確定分
析的時間/SCN窗口以及確認(rèn)是否使用提取出來的數(shù)據(jù)字典信息。?
end_logmnr() - 用來終止分析會話,它將回收LogMiner所占用的內(nèi)存。?
與LogMiner相關(guān)的視圖:?
1、v$logmnr_dictionary,LogMiner可能使用的數(shù)據(jù)字典信息,因logmnr
可以有多個字典文件,該視圖用于顯示這方面信息。?
2、v$logmnr_parameters,當(dāng)前LogMiner所設(shè)定的參數(shù)信息。?
3、v$logmnr_logs,當(dāng)前用于分析的日志列表。?
4、v$logmnr_contents,日志分析結(jié)果。
?
在開始使用LogMiner之前,了解LogMiner怎樣利用redo log和字典文件是
非常重要的。這有利于你獲得有利的結(jié)果并規(guī)劃對系統(tǒng)資源的利用。現(xiàn)在將討論
如下幾個概念:
?? ? ? Redo Log
?? ? ? 字典的選擇
?? ? ? 跟蹤DDL語句
當(dāng)使用LogMiner時,必須指定所需要分析的redo log的名稱,LogMiner檢
索這些redo log文件中的信息并通過V$LOGMNR_CONTENTS視圖返回結(jié)果。
為了保證redo log中包含著你所需的信息,你必須打開至少最小的追加日志
(Supplemental Logging)。
可以象查詢其他視圖那樣來查詢V$LOGMNR_CONTETNS視圖。每一次對
V$LOGMNR_CONTETNS視圖的查詢都會使redo log文件被依次讀取。
記住以下這些有關(guān)redo log的要點:
?? ? ? 所分析的redo log文件必須來自8.0或之后的版本。然而,某些LogMiner
的特性,只針對Oracle 9i或之后的數(shù)據(jù)庫版本。
?? ? ? 從9.2開始支持LOB和LONG數(shù)據(jù)類型,但是只對來自9.2版本的Oracle
數(shù)據(jù)庫的redo log有效。
?? ? ? Redo log所使用的字符集必須兼容于運行LogMiner的數(shù)據(jù)庫的字符集。
?? ? ? 通常情況下,分析redo log需要使用一個字典,而該字典需要來自產(chǎn)生
redo log文件的同一個數(shù)據(jù)庫。
?? ? ? 當(dāng)使用flat file平面文件或存儲在redo log中的字典時,所分析的redo log
文件可以來自LogMiner運行的數(shù)據(jù)庫或其他數(shù)據(jù)庫。
?? ? ? 如果需要使用online catalog聯(lián)機(jī)目錄作為LogMiner的字典,則只能分
析來自運行LogMiner的數(shù)據(jù)庫的redo log。
?? ? ? LogMiner所運行的硬件平臺必須和產(chǎn)生redo log文件的硬件平臺一致,
但OS可以不一樣。
?? ? ? 在運行LogMiner時需要指定正確的redo log文件名。
為了確定那個日志文件正在被LogMiner分析,可以查詢V$LOGMNR_LOGS
視圖。
為了完全地轉(zhuǎn)換redo日志中的內(nèi)容,LogMiner需要訪問一個數(shù)據(jù)庫字典。
LogMiner使用該字典將Oracle內(nèi)部的對象標(biāo)識符和數(shù)據(jù)類型轉(zhuǎn)換為對象名
稱和外部的數(shù)據(jù)格式。沒有字典,LogMiner將使用16進(jìn)制字符顯示內(nèi)部對象ID。
例如,對于如下的SQL語句:
INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);
LogMiner將顯示為:
insert into Object#2581(col#1, col#2)?
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
字典文件必須具有和產(chǎn)生redo日志的數(shù)據(jù)庫相同的字符集。然而,一旦提
取了該字典,就可以利用它在一個單獨的數(shù)據(jù)庫示例中挖掘redo日志,而不需
要連接至源數(shù)據(jù)庫。
提取一個字典文件,也可以避免在當(dāng)前的數(shù)據(jù)字典只包含著最新的表的定義
時出現(xiàn)文件。例如,如果你搜索的表在過去某個時間被刪除,而當(dāng)前的數(shù)據(jù)字典
中沒有任何有關(guān)它的參考。
LogMiner提供了三種提取字典文件的方式:
?? ? ? 將字典文件提取為一個flat file(平面文件或中間接口文件);
?? ? ? 將字典文件提取為redo日志
?? ? ? 使用online catalog(聯(lián)機(jī)日志)
將字典文件提取為一個flat file
與將字典文件提取為redo日志相比,將字典文件提取為flat file將使用更少
的系統(tǒng)資源。建議你經(jīng)常地備份所提取的字典,以便確保對較舊的redo日志的
正確分析。
為了將數(shù)據(jù)庫字典信息提取為flat file,需要使用帶有
STORE_IN_FLAT_FILE參數(shù)的DBMS_LOGMNR_D.BUILD程序。
DBMS_LOGMNR_D.BUILD程序需要訪問一個能夠放置字典文件的目錄。
因為PL/SQL程序通常不能直接訪問用戶目錄,必須手動指定一個由
DBMS_LOGMNR_D.BUILD程序使用的目錄。為了指定該目錄,必須修改初始
化文件中的UTL_FILE_DIR參數(shù):
ALTER SYSTEM SET UTL_FILE_DIR =’ /oracle/database’ SCOPE=SPFILE
然后重新引導(dǎo)啟動數(shù)據(jù)庫。
確保在創(chuàng)建flat file文件的過程中,沒有DDL操作發(fā)生。
在創(chuàng)建flat file文件時,數(shù)據(jù)庫必須處于open狀態(tài),然后執(zhí)行
DMBS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’, -
3 OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
上述的語句將創(chuàng)建一個位于/oracle/database/目錄中的字典文件
dictionary.ORA。該語句也可以簡化為:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
將字典文件提取為redo日志
為了將字典文件提取為redo日志,數(shù)據(jù)庫必須處于open狀態(tài),并且處于歸
檔模式,必須打開歸檔。當(dāng)將字典提取為redo日志時,不能有DDL語句被執(zhí)行。
因此,被提取為redo日志的字典快照被認(rèn)為是一致的,而提取為flat file的則不
是。
為了將字典提取為redo日志,需要使用帶有STORE_IN_REDO_FILES參數(shù)
的DBMS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
將字典提取為redo日志的操作占用大量的系統(tǒng)資源,所以最好將這一操作
限制在系統(tǒng)壓力較小的時段進(jìn)行。依賴于字典信息的大小,有可能產(chǎn)生多個redo
日志,在這些redo日志被歸檔之后,可以通過查詢V$ARCHIVED_LOG視圖來
查詢:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN=’YES’;
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END=’YES’;
如果是將字典信息提取為redo文件的,那么在使用
DBMD_LOGMNR.ADDLOGFILE指定所需要分析的日志文件時,需要將這些包
含字典信息的redo文件也添加進(jìn)去。
同時在使用START_LOGMNR開始分析時,需要指定
DICT_FROM_REDO_LOGS的參數(shù)。
使用聯(lián)機(jī)目錄
為了使LogMiner直接使用數(shù)據(jù)庫當(dāng)前使用的字典,在開始LogMiner時可
以指定將聯(lián)機(jī)目錄作為字典源:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
使用聯(lián)機(jī)目錄,意味著不需要再提取字典文件,是開始分析日志的最快的方
式。除了可以分析聯(lián)機(jī)redo日志外,還可以在和產(chǎn)生歸檔日志文件相同的系統(tǒng)
上分析歸檔日志文件。
然而,記住聯(lián)機(jī)目錄只能重建應(yīng)用于表的最新版本上的SQL語句。一旦表
被修改,聯(lián)機(jī)目錄就無法反映出表之前的版本。這就意味著LogMiner不能重建
執(zhí)行于表的舊版本上的SQL語句。相反,LogMiner產(chǎn)生類似于如下語句的不可
執(zhí)行的SQL語句:
insert into Object#2581(col#1, col#2)?
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
跟蹤DDL語句
當(dāng)你啟動LogMiner時,其會自動創(chuàng)建其自己的內(nèi)部字典。如果源字典是flat?
file字典或redo日志中的字典,則可以使用DDL_DICT_TRACKING參數(shù)來跟蹤
DDL語句。DDL跟蹤默認(rèn)是關(guān)閉的。為了打開這一功能,可以在啟動LogMiner
時使用DDL_DICT_TRACKING參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DDL_DICT_TRACKING);
當(dāng)使用這一參數(shù)時,LogMiner將所有在redo日志中發(fā)現(xiàn)的DDL語句存儲
在其的內(nèi)部字典中:
SQL> SELECT USERNAME, SQL_REDO
2 FROM V$LOGMNR_CONTENTS
3 WHERE USERNAME = ’SYS’ AND OEPRATION = ’DDL’;
當(dāng)使用DDL_DICT_TRACKING時,記住如下的要點:
?? ? ? 當(dāng)使用聯(lián)機(jī)目錄(Online catalog)時,也就是當(dāng)使用
DICT_FROM_ONLINE_CATALOG參數(shù)時,是不能使用
DDL_DICT_TRACKING選項的。
?? ? ? 使用DDL_DICT_TRACKING時,要求數(shù)據(jù)庫處于open狀態(tài)。
應(yīng)該為LogMiner的表提供一個單獨的表空間。默認(rèn)情況下LogMiner的表
是創(chuàng)建在SYSTEM表空間中的。使用DBMS_LOGMNR_D.SET_TABLESPACE
可以在一個單獨的表空間中重建這些LogMiner的表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
過濾LogMiner返回的數(shù)據(jù)
只顯示已提交的事務(wù):
可以使用COMMITTED_DATA_ONLY參數(shù)來只顯示那些被提交的事務(wù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.COMMITTED_DATA_ONLY);
當(dāng)使用這一參數(shù)時,LogMiner將所有的DML操作按照事務(wù)的關(guān)系組合在一
起。這些事務(wù)按照它們被提交的順序顯示出來。
忽略Redo錯誤
可以使用SKIP_CORRUPTION參數(shù)來忽略redo日志中的所有錯誤:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.SKIP_CORRUPTION);
按時間過濾數(shù)據(jù):
為了按照時間過濾數(shù)據(jù),使用STARTTIME和ENDTIME參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTTIME => TO_DATE('01-Jan-1998 08:30:00', 'DD-MON-YYYY HH:MI:SS'),-
4 ENDTIME => TO_DATE('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));
按照SCN過濾:
為了按照SCN(System Change Number)來過濾數(shù)據(jù),使用STARTSCN和
ENDSCN參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTSCN => 100, -
4 ENDSCN => 150);
典型的LogMiner步驟:
一個典型的LogMiner的操作包含如下步驟:
1. ? ? ? ?進(jìn)行初始化設(shè)置;
2. ? ? ? ?提取一個字典
3. ? ? ? ?指定需要分析的redo日志文件
4. ? ? ? ?開始LogMiner
5. ? ? ? ?查詢V$LOGMNR_CONTENTS視圖
6. ? ? ? ?結(jié)束LogMiner
1、進(jìn)行初始化設(shè)置
打開你希望使用的那一種supplemental logging,Oracle公司建議打開最小的
supplemental logging:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
使用DBMS_LOGMNR_D.SET_TABLESPACE重新創(chuàng)建所有的LogMiner
表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
2、提取字典
如前所屬,分別將字典文件提取為flat file或redo日志,或者直接使用Online?
catalog:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
或:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
3、指定需要分析的redo日志:
在啟動LogMiner之前,必須首先使用DBMS_LOGMNR.ADD_LOGFILE來
指定需要分析的redo文件。如下的示范步驟,用來添加或刪除需要分析的Redo
日志文件:
1、 ? ? ? ?確保數(shù)據(jù)庫處于打開狀態(tài)
2、 ? ? ? ?創(chuàng)建redo日志的列表。在DBMS_LOGMNR.ADD_LOGFILE中指定NEW
參數(shù)來表明這是一個新的列表:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log1.f', -
3 OPTIONS => DBMS_LOGMNR.NEW);
3、 ? ? ? ?如果需要的話,在DBMS_LOGMNR.ADD_LOGFILE中指定ADDFILE
參數(shù),以便追加redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.ADDFILE);
?? ? ? ?上面示例中的OPTIONS是可選的,也可以直接添加:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME=>’/oracle/logs/log2.f’);
4、 ? ? ? ?如果需要的話,可以從列表中刪除redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.REMOVEFILE);
5、 ? ? ? ?當(dāng)進(jìn)行LogMiner的實例就是產(chǎn)生Redo日志的實例時,可以使用連續(xù)分
析日志。首先需要指定一個redo日志文件,然后在開始LogMiner時,
指定DBMS_LOGMNR.CONTINUOUS_MINE參數(shù)。(該參數(shù)在RAC環(huán)
境中不能使用)
在添加分析的redo日志文件時,不僅可以添加歸檔后的redo日志文件,也
可以添加聯(lián)機(jī)redo日志文件。
4、啟動LogMiner
1、 ? ? ? ?執(zhí)行DBMS_LOGMNR.START_LOGMNR來啟動LogMiner。
?? ? 建議在啟動時指定Dictionary參數(shù),如果不指定,那么LogMiner無法
完成內(nèi)部標(biāo)識符和目標(biāo)名稱和外部數(shù)據(jù)類型之間的轉(zhuǎn)換。
?? ? 如果使用flat file,則需要指定該文件的完整路徑名稱:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME =>'/oracle/database/dictionary.ora');
?? ? 如果沒有指定字典,則需要指定DICT_FROM_REDO_LOGS或?
DICT_FROM_ONLINE_CATALOG參數(shù)。
?? ? 如果指定了DICT_FROM_REDO_LOGS,LogMiner會期待在你使用
DBMS_LOGMNR.ADD_LOGFILE指定的redo日志中發(fā)現(xiàn)字典。
2、 ? ? ? ?如果需要的話,可以按時間或SCN過濾信息
3、 ? ? ? ?也可以使用Options參數(shù)來指定LogMiner的其他特性:
4、查詢V$LOGMNR_CONTETNS視圖
5、結(jié)束LogMiner
可以使用DBMS_LOGMNR.END_LOGMNR來結(jié)束一個LogMiner:
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;
使用LogMiner的示例:
在開始下面的示例之前,已經(jīng)設(shè)置了UTL_FILE_DIR并且在一個新建的表
空間內(nèi)重建了LogMiner的表。
一、使用Logminer來分析當(dāng)前的聯(lián)機(jī)redo日志文件
SQL> execute dbms_logmnr_d.build('dictionary.dic',-
> 'd:\oracle\oradata\oradell\logmnr\',-
> options=>dbms_logmnr_d.store_in_flat_file);
PL/SQL 過程已成功完成。
//創(chuàng)建字典文件
SQL> select member from v$logfile
??2 ?where group#=(select group# from v$log
??3 ?where status ='CURRENT')
??4 ?;
MEMBER
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\REDO03.LOG ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//查詢當(dāng)前的聯(lián)機(jī)redo日志文件的位置
SQL> execute dbms_logmnr.add_logfile( -
> logfilename =>'d:\oracle\oradata\oradell\redo03.log',-
> options =>dbms_logmnr.new);
PL/SQL 過程已成功完成。
//將該文件加入日志分析的列表中
SQL> execute dbms_logmnr.start_logmnr(-
> dictfilename=>'d:\oracle\oradata\oradell\logmnr\dictionary.dic',-
> options =>dbms_logmnr.committed_data_only);
PL/SQL 過程已成功完成。
//開始Logminer,只顯示已提交的事務(wù)
SQL> select count(*) from v$logmnr_contents;
??COUNT(*) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
---------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?100277
//對分析結(jié)果進(jìn)行查詢
二、分析已歸檔的redo日志文件,將字典文件提取為redo日志文件
SQL> execute dbms_logmnr_d.build(-
> options=>dbms_logmnr_d.store_in_redo_logs);
PL/SQL 過程已成功完成。
//將字典信息提取為redo日志
SQL> ?SELECT NAME FROM V$ARCHIVED_LOG WHERE?
DICTIONARY_BEGIN='YES';
NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001
已選擇6行。
SQL> ?SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001
已選擇6行。
//查詢前一步中生產(chǎn)的包含字典信息的redo文件
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00048.001',-
> options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。
//首先,將包含字典信息的redo日志加入等待分析的日志文件列表中
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
//之后依次添加需要分析的redo日志文件
SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 過程已成功完成。
//啟動LogMiner
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00020.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00021.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00022.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00023.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Missing log file(s) for thread number 1, sequence number(s) 24 to 47 ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
已選擇6行。
//將被分析的redo日志列表
SQL> select sql_redo from v$logmnr_contents
??2 ?where username='SYS';
SQL_REDO ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
set transaction read write; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Unsupported ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
commit; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
commit; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
set transaction read write; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
已選擇16921行。
//查詢分析結(jié)果
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
//刪除已被分析的redo日志,但保留包含字典信息的redo日志文件
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//此時的redo日志列表
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00040.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
//增加新的等待分析的redo日志
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00040.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//此時的redo日志列表
SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 過程已成功完成。
SQL> select count(*) from v$logmnr_contents where username ='ALEX';
??COUNT(*) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
---------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ? ? 0 ??
//重新啟動LogMiner分析,并查詢結(jié)果 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
LogMiner的基本介紹
所有對用戶數(shù)據(jù)和數(shù)據(jù)字典的改變都記錄在Oracle的Redo Log中,因此,
redo log包含了所有進(jìn)行恢復(fù)操作所需要的信息。利用這些數(shù)據(jù),DBA可以:
?? ? ? 在應(yīng)用級別上,發(fā)現(xiàn)發(fā)生于數(shù)據(jù)庫上的邏輯錯誤。例如錯誤地Update了
某個表中的全部記錄。
?? ? ? 發(fā)現(xiàn)用戶的誤操作。
?? ? ? 確定如何在事務(wù)級別上進(jìn)行最精細(xì)的還原操作。
?? ? ? 通過趨向分析,進(jìn)行數(shù)據(jù)庫的調(diào)優(yōu)和規(guī)劃。
?? ? ? 進(jìn)行崗位審計。
Oracle公司通過LogMiner提供了訪問redo log的SQL,其是Oracle數(shù)據(jù)庫
服務(wù)器的一部分。LogMiner通過V$LOGMNR_CONTENTS視圖顯示redo log中
的信息。這個視圖中保存著與對數(shù)據(jù)庫的改變有關(guān)的歷史信息,包含,但不局限
于,下列信息:
?? ? ? 數(shù)據(jù)庫的改變的類型(Insert、Update、Delete或者是DDL)
?? ? ? 發(fā)生變化時的SCN
?? ? ? 變化被提交時的SCN
?? ? ? 該變化屬于那個事務(wù)
?? ? ? 所修改的對象的表名和方案名
?? ? ? 提交了該DDL或DML語句的用戶信息
?? ? ? 重建的SQL語句,其示出了回滾UNDO該變化所需的SQL語句。
Oracle 9i提供的LogMiner的增強(qiáng)特性
1、支持更多數(shù)據(jù)/存儲類型:鏈接/遷移行、CLUSTER表操作、DIRECT PATH
插入以及DDL操作。在V$LOGMNR_CONTENTS的SQL_REDO中可以看到
DDL操作的原句(CREATE USER除外,其中的密碼將以加密的形式出現(xiàn),而
不是原始密碼)。如果TX_AUDITING初始化參數(shù)設(shè)為TRUE,則所有操作的數(shù)
據(jù)庫賬號將被記錄。?
2、提取和使用數(shù)據(jù)字典的選項:現(xiàn)在數(shù)據(jù)字典不僅可以提取到一個外部文
件中,還可以直接提取到重做日志流中,它在日志流中提供了操作當(dāng)時的數(shù)據(jù)字
典快照,這樣就可以實現(xiàn)離線分析。?
3、允許對DML操作按事務(wù)進(jìn)行分組:可以在START_LOGMNR()中設(shè)置
COMMITTED_DATA_ONLY選項,實現(xiàn)對DML操作的分組,這樣將按SCN的
順序返回已經(jīng)提交的事務(wù)。?
4、支持SCHEMA的變化:在數(shù)據(jù)庫打開的狀態(tài)下,如果使用了LogMiner
的DDL_DICT_TRACKING選項,Oracle9i的LogMiner將自動對比最初的日志
流和當(dāng)前系統(tǒng)的數(shù)據(jù)字典,并返回正確的DDL語句,并且會自動偵察并標(biāo)記當(dāng)
前數(shù)據(jù)字典和最初日志流之間的差別,這樣即使最初日志流中所涉及的表已經(jīng)被
更改或者根本已經(jīng)不存在,LogMiner同樣會返回正確的DDL語句。?
5、在日志中記錄更多列信息的能力:例如對于UPDATE操作不僅會記錄被
更新行的情況,還可以捕捉更多前影信息。?
6、支持基于數(shù)值的查詢:Oracle9i LogMiner在支持原有基于元數(shù)據(jù)(操作、
對象等)查詢的基礎(chǔ)上,開始支持基于實際涉及到的數(shù)據(jù)的查詢。例如涉及一個
工資表,現(xiàn)在我們可以很容易地查出員工工資由1000變成2000的原始更新語句,
而在之前我們只能選出所有的更新語句。
Redo log使用內(nèi)部產(chǎn)生的數(shù)字化標(biāo)識符來標(biāo)識表和其相關(guān)的列,為了重建
SQL語句,LogMiner需要知道內(nèi)部標(biāo)識符和用戶定義的名稱之間的映射關(guān)系。
這一映射關(guān)系存儲在一個數(shù)據(jù)字典(Dictionary)中。LogMiner提供了一個程序
(DBMS_LOGMNR_D.BUILD)來提取該數(shù)據(jù)字典。
LogMiner的基本組成
LogMiner包含兩個PL/SQL包和幾個視圖:?
1、dbms_logmnr_d包,包括一個用于提取數(shù)據(jù)字典信息的過程,即
dbms_logmnr_d.build()過程。 還包含一個重建LogMiner表的過程,
dbms_logmnr_d.SET_TABLESPACE,默認(rèn)情況下,LogMiner的表是建在SYSTEM表
空間下的。
2、dbms_logmnr包,它有三個過程:?
add_logfile(name varchar2, options number) - 用來添加/刪除用于分析的日志
文件;?
start_logmnr(start_scn number, end_scn number, start_time number,end_time?
number, dictfilename varchar2, options number) - 用來開啟日志分析,同時確定分
析的時間/SCN窗口以及確認(rèn)是否使用提取出來的數(shù)據(jù)字典信息。?
end_logmnr() - 用來終止分析會話,它將回收LogMiner所占用的內(nèi)存。?
與LogMiner相關(guān)的視圖:?
1、v$logmnr_dictionary,LogMiner可能使用的數(shù)據(jù)字典信息,因logmnr
可以有多個字典文件,該視圖用于顯示這方面信息。?
2、v$logmnr_parameters,當(dāng)前LogMiner所設(shè)定的參數(shù)信息。?
3、v$logmnr_logs,當(dāng)前用于分析的日志列表。?
4、v$logmnr_contents,日志分析結(jié)果。
?
在開始使用LogMiner之前,了解LogMiner怎樣利用redo log和字典文件是
非常重要的。這有利于你獲得有利的結(jié)果并規(guī)劃對系統(tǒng)資源的利用。現(xiàn)在將討論
如下幾個概念:
?? ? ? Redo Log
?? ? ? 字典的選擇
?? ? ? 跟蹤DDL語句
當(dāng)使用LogMiner時,必須指定所需要分析的redo log的名稱,LogMiner檢
索這些redo log文件中的信息并通過V$LOGMNR_CONTENTS視圖返回結(jié)果。
為了保證redo log中包含著你所需的信息,你必須打開至少最小的追加日志
(Supplemental Logging)。
可以象查詢其他視圖那樣來查詢V$LOGMNR_CONTETNS視圖。每一次對
V$LOGMNR_CONTETNS視圖的查詢都會使redo log文件被依次讀取。
記住以下這些有關(guān)redo log的要點:
?? ? ? 所分析的redo log文件必須來自8.0或之后的版本。然而,某些LogMiner
的特性,只針對Oracle 9i或之后的數(shù)據(jù)庫版本。
?? ? ? 從9.2開始支持LOB和LONG數(shù)據(jù)類型,但是只對來自9.2版本的Oracle
數(shù)據(jù)庫的redo log有效。
?? ? ? Redo log所使用的字符集必須兼容于運行LogMiner的數(shù)據(jù)庫的字符集。
?? ? ? 通常情況下,分析redo log需要使用一個字典,而該字典需要來自產(chǎn)生
redo log文件的同一個數(shù)據(jù)庫。
?? ? ? 當(dāng)使用flat file平面文件或存儲在redo log中的字典時,所分析的redo log
文件可以來自LogMiner運行的數(shù)據(jù)庫或其他數(shù)據(jù)庫。
?? ? ? 如果需要使用online catalog聯(lián)機(jī)目錄作為LogMiner的字典,則只能分
析來自運行LogMiner的數(shù)據(jù)庫的redo log。
?? ? ? LogMiner所運行的硬件平臺必須和產(chǎn)生redo log文件的硬件平臺一致,
但OS可以不一樣。
?? ? ? 在運行LogMiner時需要指定正確的redo log文件名。
為了確定那個日志文件正在被LogMiner分析,可以查詢V$LOGMNR_LOGS
視圖。
為了完全地轉(zhuǎn)換redo日志中的內(nèi)容,LogMiner需要訪問一個數(shù)據(jù)庫字典。
LogMiner使用該字典將Oracle內(nèi)部的對象標(biāo)識符和數(shù)據(jù)類型轉(zhuǎn)換為對象名
稱和外部的數(shù)據(jù)格式。沒有字典,LogMiner將使用16進(jìn)制字符顯示內(nèi)部對象ID。
例如,對于如下的SQL語句:
INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);
LogMiner將顯示為:
insert into Object#2581(col#1, col#2)?
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
字典文件必須具有和產(chǎn)生redo日志的數(shù)據(jù)庫相同的字符集。然而,一旦提
取了該字典,就可以利用它在一個單獨的數(shù)據(jù)庫示例中挖掘redo日志,而不需
要連接至源數(shù)據(jù)庫。
提取一個字典文件,也可以避免在當(dāng)前的數(shù)據(jù)字典只包含著最新的表的定義
時出現(xiàn)文件。例如,如果你搜索的表在過去某個時間被刪除,而當(dāng)前的數(shù)據(jù)字典
中沒有任何有關(guān)它的參考。
LogMiner提供了三種提取字典文件的方式:
?? ? ? 將字典文件提取為一個flat file(平面文件或中間接口文件);
?? ? ? 將字典文件提取為redo日志
?? ? ? 使用online catalog(聯(lián)機(jī)日志)
將字典文件提取為一個flat file
與將字典文件提取為redo日志相比,將字典文件提取為flat file將使用更少
的系統(tǒng)資源。建議你經(jīng)常地備份所提取的字典,以便確保對較舊的redo日志的
正確分析。
為了將數(shù)據(jù)庫字典信息提取為flat file,需要使用帶有
STORE_IN_FLAT_FILE參數(shù)的DBMS_LOGMNR_D.BUILD程序。
DBMS_LOGMNR_D.BUILD程序需要訪問一個能夠放置字典文件的目錄。
因為PL/SQL程序通常不能直接訪問用戶目錄,必須手動指定一個由
DBMS_LOGMNR_D.BUILD程序使用的目錄。為了指定該目錄,必須修改初始
化文件中的UTL_FILE_DIR參數(shù):
ALTER SYSTEM SET UTL_FILE_DIR =’ /oracle/database’ SCOPE=SPFILE
然后重新引導(dǎo)啟動數(shù)據(jù)庫。
確保在創(chuàng)建flat file文件的過程中,沒有DDL操作發(fā)生。
在創(chuàng)建flat file文件時,數(shù)據(jù)庫必須處于open狀態(tài),然后執(zhí)行
DMBS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’, -
3 OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
上述的語句將創(chuàng)建一個位于/oracle/database/目錄中的字典文件
dictionary.ORA。該語句也可以簡化為:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
將字典文件提取為redo日志
為了將字典文件提取為redo日志,數(shù)據(jù)庫必須處于open狀態(tài),并且處于歸
檔模式,必須打開歸檔。當(dāng)將字典提取為redo日志時,不能有DDL語句被執(zhí)行。
因此,被提取為redo日志的字典快照被認(rèn)為是一致的,而提取為flat file的則不
是。
為了將字典提取為redo日志,需要使用帶有STORE_IN_REDO_FILES參數(shù)
的DBMS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
將字典提取為redo日志的操作占用大量的系統(tǒng)資源,所以最好將這一操作
限制在系統(tǒng)壓力較小的時段進(jìn)行。依賴于字典信息的大小,有可能產(chǎn)生多個redo
日志,在這些redo日志被歸檔之后,可以通過查詢V$ARCHIVED_LOG視圖來
查詢:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN=’YES’;
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END=’YES’;
如果是將字典信息提取為redo文件的,那么在使用
DBMD_LOGMNR.ADDLOGFILE指定所需要分析的日志文件時,需要將這些包
含字典信息的redo文件也添加進(jìn)去。
同時在使用START_LOGMNR開始分析時,需要指定
DICT_FROM_REDO_LOGS的參數(shù)。
使用聯(lián)機(jī)目錄
為了使LogMiner直接使用數(shù)據(jù)庫當(dāng)前使用的字典,在開始LogMiner時可
以指定將聯(lián)機(jī)目錄作為字典源:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
使用聯(lián)機(jī)目錄,意味著不需要再提取字典文件,是開始分析日志的最快的方
式。除了可以分析聯(lián)機(jī)redo日志外,還可以在和產(chǎn)生歸檔日志文件相同的系統(tǒng)
上分析歸檔日志文件。
然而,記住聯(lián)機(jī)目錄只能重建應(yīng)用于表的最新版本上的SQL語句。一旦表
被修改,聯(lián)機(jī)目錄就無法反映出表之前的版本。這就意味著LogMiner不能重建
執(zhí)行于表的舊版本上的SQL語句。相反,LogMiner產(chǎn)生類似于如下語句的不可
執(zhí)行的SQL語句:
insert into Object#2581(col#1, col#2)?
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
跟蹤DDL語句
當(dāng)你啟動LogMiner時,其會自動創(chuàng)建其自己的內(nèi)部字典。如果源字典是flat?
file字典或redo日志中的字典,則可以使用DDL_DICT_TRACKING參數(shù)來跟蹤
DDL語句。DDL跟蹤默認(rèn)是關(guān)閉的。為了打開這一功能,可以在啟動LogMiner
時使用DDL_DICT_TRACKING參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DDL_DICT_TRACKING);
當(dāng)使用這一參數(shù)時,LogMiner將所有在redo日志中發(fā)現(xiàn)的DDL語句存儲
在其的內(nèi)部字典中:
SQL> SELECT USERNAME, SQL_REDO
2 FROM V$LOGMNR_CONTENTS
3 WHERE USERNAME = ’SYS’ AND OEPRATION = ’DDL’;
當(dāng)使用DDL_DICT_TRACKING時,記住如下的要點:
?? ? ? 當(dāng)使用聯(lián)機(jī)目錄(Online catalog)時,也就是當(dāng)使用
DICT_FROM_ONLINE_CATALOG參數(shù)時,是不能使用
DDL_DICT_TRACKING選項的。
?? ? ? 使用DDL_DICT_TRACKING時,要求數(shù)據(jù)庫處于open狀態(tài)。
應(yīng)該為LogMiner的表提供一個單獨的表空間。默認(rèn)情況下LogMiner的表
是創(chuàng)建在SYSTEM表空間中的。使用DBMS_LOGMNR_D.SET_TABLESPACE
可以在一個單獨的表空間中重建這些LogMiner的表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
過濾LogMiner返回的數(shù)據(jù)
只顯示已提交的事務(wù):
可以使用COMMITTED_DATA_ONLY參數(shù)來只顯示那些被提交的事務(wù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.COMMITTED_DATA_ONLY);
當(dāng)使用這一參數(shù)時,LogMiner將所有的DML操作按照事務(wù)的關(guān)系組合在一
起。這些事務(wù)按照它們被提交的順序顯示出來。
忽略Redo錯誤
可以使用SKIP_CORRUPTION參數(shù)來忽略redo日志中的所有錯誤:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.SKIP_CORRUPTION);
按時間過濾數(shù)據(jù):
為了按照時間過濾數(shù)據(jù),使用STARTTIME和ENDTIME參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTTIME => TO_DATE('01-Jan-1998 08:30:00', 'DD-MON-YYYY HH:MI:SS'),-
4 ENDTIME => TO_DATE('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));
按照SCN過濾:
為了按照SCN(System Change Number)來過濾數(shù)據(jù),使用STARTSCN和
ENDSCN參數(shù):
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTSCN => 100, -
4 ENDSCN => 150);
典型的LogMiner步驟:
一個典型的LogMiner的操作包含如下步驟:
1. ? ? ? ?進(jìn)行初始化設(shè)置;
2. ? ? ? ?提取一個字典
3. ? ? ? ?指定需要分析的redo日志文件
4. ? ? ? ?開始LogMiner
5. ? ? ? ?查詢V$LOGMNR_CONTENTS視圖
6. ? ? ? ?結(jié)束LogMiner
1、進(jìn)行初始化設(shè)置
打開你希望使用的那一種supplemental logging,Oracle公司建議打開最小的
supplemental logging:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
使用DBMS_LOGMNR_D.SET_TABLESPACE重新創(chuàng)建所有的LogMiner
表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
2、提取字典
如前所屬,分別將字典文件提取為flat file或redo日志,或者直接使用Online?
catalog:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
或:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
3、指定需要分析的redo日志:
在啟動LogMiner之前,必須首先使用DBMS_LOGMNR.ADD_LOGFILE來
指定需要分析的redo文件。如下的示范步驟,用來添加或刪除需要分析的Redo
日志文件:
1、 ? ? ? ?確保數(shù)據(jù)庫處于打開狀態(tài)
2、 ? ? ? ?創(chuàng)建redo日志的列表。在DBMS_LOGMNR.ADD_LOGFILE中指定NEW
參數(shù)來表明這是一個新的列表:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log1.f', -
3 OPTIONS => DBMS_LOGMNR.NEW);
3、 ? ? ? ?如果需要的話,在DBMS_LOGMNR.ADD_LOGFILE中指定ADDFILE
參數(shù),以便追加redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.ADDFILE);
?? ? ? ?上面示例中的OPTIONS是可選的,也可以直接添加:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME=>’/oracle/logs/log2.f’);
4、 ? ? ? ?如果需要的話,可以從列表中刪除redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.REMOVEFILE);
5、 ? ? ? ?當(dāng)進(jìn)行LogMiner的實例就是產(chǎn)生Redo日志的實例時,可以使用連續(xù)分
析日志。首先需要指定一個redo日志文件,然后在開始LogMiner時,
指定DBMS_LOGMNR.CONTINUOUS_MINE參數(shù)。(該參數(shù)在RAC環(huán)
境中不能使用)
在添加分析的redo日志文件時,不僅可以添加歸檔后的redo日志文件,也
可以添加聯(lián)機(jī)redo日志文件。
4、啟動LogMiner
1、 ? ? ? ?執(zhí)行DBMS_LOGMNR.START_LOGMNR來啟動LogMiner。
?? ? 建議在啟動時指定Dictionary參數(shù),如果不指定,那么LogMiner無法
完成內(nèi)部標(biāo)識符和目標(biāo)名稱和外部數(shù)據(jù)類型之間的轉(zhuǎn)換。
?? ? 如果使用flat file,則需要指定該文件的完整路徑名稱:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME =>'/oracle/database/dictionary.ora');
?? ? 如果沒有指定字典,則需要指定DICT_FROM_REDO_LOGS或?
DICT_FROM_ONLINE_CATALOG參數(shù)。
?? ? 如果指定了DICT_FROM_REDO_LOGS,LogMiner會期待在你使用
DBMS_LOGMNR.ADD_LOGFILE指定的redo日志中發(fā)現(xiàn)字典。
2、 ? ? ? ?如果需要的話,可以按時間或SCN過濾信息
3、 ? ? ? ?也可以使用Options參數(shù)來指定LogMiner的其他特性:
4、查詢V$LOGMNR_CONTETNS視圖
5、結(jié)束LogMiner
可以使用DBMS_LOGMNR.END_LOGMNR來結(jié)束一個LogMiner:
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;
使用LogMiner的示例:
在開始下面的示例之前,已經(jīng)設(shè)置了UTL_FILE_DIR并且在一個新建的表
空間內(nèi)重建了LogMiner的表。
一、使用Logminer來分析當(dāng)前的聯(lián)機(jī)redo日志文件
SQL> execute dbms_logmnr_d.build('dictionary.dic',-
> 'd:\oracle\oradata\oradell\logmnr\',-
> options=>dbms_logmnr_d.store_in_flat_file);
PL/SQL 過程已成功完成。
//創(chuàng)建字典文件
SQL> select member from v$logfile
??2 ?where group#=(select group# from v$log
??3 ?where status ='CURRENT')
??4 ?;
MEMBER
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\REDO03.LOG ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//查詢當(dāng)前的聯(lián)機(jī)redo日志文件的位置
SQL> execute dbms_logmnr.add_logfile( -
> logfilename =>'d:\oracle\oradata\oradell\redo03.log',-
> options =>dbms_logmnr.new);
PL/SQL 過程已成功完成。
//將該文件加入日志分析的列表中
SQL> execute dbms_logmnr.start_logmnr(-
> dictfilename=>'d:\oracle\oradata\oradell\logmnr\dictionary.dic',-
> options =>dbms_logmnr.committed_data_only);
PL/SQL 過程已成功完成。
//開始Logminer,只顯示已提交的事務(wù)
SQL> select count(*) from v$logmnr_contents;
??COUNT(*) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
---------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?100277
//對分析結(jié)果進(jìn)行查詢
二、分析已歸檔的redo日志文件,將字典文件提取為redo日志文件
SQL> execute dbms_logmnr_d.build(-
> options=>dbms_logmnr_d.store_in_redo_logs);
PL/SQL 過程已成功完成。
//將字典信息提取為redo日志
SQL> ?SELECT NAME FROM V$ARCHIVED_LOG WHERE?
DICTIONARY_BEGIN='YES';
NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001
已選擇6行。
SQL> ?SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001
已選擇6行。
//查詢前一步中生產(chǎn)的包含字典信息的redo文件
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00048.001',-
> options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。
//首先,將包含字典信息的redo日志加入等待分析的日志文件列表中
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
//之后依次添加需要分析的redo日志文件
SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 過程已成功完成。
//啟動LogMiner
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00020.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00021.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00022.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00023.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Missing log file(s) for thread number 1, sequence number(s) 24 to 47 ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
已選擇6行。
//將被分析的redo日志列表
SQL> select sql_redo from v$logmnr_contents
??2 ?where username='SYS';
SQL_REDO ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
set transaction read write; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Unsupported ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
commit; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
commit; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
set transaction read write; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
已選擇16921行。
//查詢分析結(jié)果
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 過程已成功完成。
//刪除已被分析的redo日志,但保留包含字典信息的redo日志文件
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//此時的redo日志列表
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00040.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。
//增加新的等待分析的redo日志
SQL> select filename from v$logmnr_logs;
FILENAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00040.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d:\oracle\oradata\oradell\archive\arc00048.001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//此時的redo日志列表
SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 過程已成功完成。
SQL> select count(*) from v$logmnr_contents where username ='ALEX';
??COUNT(*) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
---------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ? ? 0 ??
//重新啟動LogMiner分析,并查詢結(jié)果 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
總結(jié)
以上是生活随笔為你收集整理的LogMiner学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日志挖掘(logminer)
- 下一篇: oracle数据类型大小限制