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