關于logminer的使用,轉載一篇從oracle中國用戶討論組的文章,自己也方便查找
一、logminer的用途
日志文件中存放著所有進行數據庫恢復的數據,記錄了針對數據庫結構的每一個變化,也就是對數據庫操作的所有DML語句。
logminer 工具即可以用來分析在線,也可以用來分析離線日志文件,即可以分析本身自己數據庫的重作日志文件,也可以用來分析其他數據庫的重作日志文件。
總的說來,logminer工具的主要用途有:
1. 跟蹤數據庫的變化:可以離線的跟蹤數據庫的變化,而不會影響在線系統的性能。
2. 回退數據庫的變化:回退特定的變化數據,減少point-in-time recovery的執行。
3. 優化和擴容計劃:可通過分析日志文件中的數據以分析數據增長模式。
二、安裝logminer
要安裝logminer工具,必須首先要運行下面這樣兩個腳本,
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql
這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。
三、使用logminer工具
下面將詳細介紹如何使用logminer工具。
1、創建數據字典文件(data-dictionary)
前面已經談到,logminer工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動logminer時創建)組成。在使用logminer工具分析redo log文件之前,必須使用DBMS_LOGMNR_D 包將數據字典導出為一個文本文件。該字典文件是可選的,但是如果沒有它,logminer解釋出來的語句中關于數據字典中的部分(如表名、列名等)和數值都將是16進制的形式,我們是無法直接理解的。例如,下面的sql語句: INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三'); logminer解釋出來的結果將是下面這個樣子, insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));
創建數據字典的目的就是讓logminer引用涉及到內部數據字典中的部分時為他們實際的名字,而不是系統內部的16進制。數據字典文件是一個文本文件,使用包DBMS_LOGMNR_D來創建。如果我們要分析的數據庫中的表有變化,影響到庫的數據字典也發生變化,這時就需要重新創建該字典文件。另外一種情況是在分析另外一個數據庫文件的重作日志時,也必須要重新生成一遍被分析數據庫的數據字典文件。
首先指定數據字典文件的位置,也就是添加一個參數UTL_FILE_DIR,該參數值為服務器中放置數據字典文件的目錄,這里我們假定目錄為:f\logminer,以sys用戶登錄,運行以下命令:
alter system set UTL_FILE_DIR ='f:\logminer' scope=spfile;
shutdown immediate "關閉數據庫
startup "重新啟動數據庫,使新加的參數生效,然后創建數據字典文件:
SQL> CONNECT SYS
SQL> EXECUTE dbms_logmnr_d.build( 'dictionary.ora', 'f:\logminer');
2、創建要分析的日志文件列表
Oracle的重作日志分為兩種,在線(online)和離線(offline)歸檔日志文件,下面就分別來討論這兩種不同日志文件的列表創建。
(1)分析在線重作日志文件
A. 查詢在線日志文件
select * from v$log //根據顯示結果可知當前日志的組號為1
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 7 NO CURRENT
2 3 YES INACTIVE
3 6 YES INACTIVE
4 4 YES INACTIVE
5 5 YES INACTIVE
select * from v$logfile //根據組號可以找到對應的日志文件為red0o1.log
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
1 ONLINE F:\ORACLE\ORADATA\SZGOV92\REDO01.LOG
2 ONLINE F:\ORACLE\ORADATA\SZGOV92\REDO02.LOG
3 ONLINE F:\ORACLE\ORADATA\SZGOV92\REDO03.LOG
4 ONLINE F:\ORACLE\ORADATA\SZGOV92\REDO04.LOG
5 ONLINE F:\ORACLE\ORADATA\SZGOV92\REDO05.LOG
B. 創建列表
SQL> EXECUTE dbms_logmnr.add_logfile(' F:\ORACLE\ORADATA\SZGOV92\REDO01.LOG ', dbms_logmnr.new);
C. 添加其他日志文件到列表
SQL> EXECUTE dbms_logmnr.add_logfile(' F:\ORACLE\ORADATA\SZGOV92\REDO02.LOG ', dbms_logmnr.addfile);
D.刪除列表中的日志文件
SQL> EXECUTE dbms_logmnr.add_logfile(' F:\ORACLE\ORADATA\SZGOV92\REDO02.LOG ', dbms_logmnr.remove);
(2)分析離線日志文件
A.創建列表
SQL> EXECUTE dbms_logmnr.add_logfile(
' e:\Oracle\oradata\szgov92\archive\ARCARC09108.001', dbms_logmnr.new);
B.添加另外的日志文件到列表
SQL> EXECUTE dbms_logmnr.add_logfile(
' e:\Oracle\oradata\szgov92\archive\ARCARC09109.001', dbms_logmnr.addfile);
關于這個日志文件列表中需要分析日志文件的個數完全由你自己決定,但這里建議最好是每次只添加一個需要分析的日志文件,在對該文件分析完畢后,再添加另外的文件。
3、使用logminer進行日志分析
(1)無限制條件
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName=>' f:\logminer\dictionary.ora ');
(2)有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數的設置(參數含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數我們可以限制只分析某一時間范圍的日志。如下面的例子,我們僅僅分析2004年9月18日的日志,:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => ' f:\logminer\dictionary.ora',
StartTime => to_date('2006-02-13 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName => ' f:\logminer\dictionary.ora',
StartScn => 20, EndScn => 50);
表1 DBMS_LOGMNR.START__LOGMNR過程參數含義
參數 |
參數類型 |
默認值 |
含義 |
StartScn |
數字型(Number) |
0 |
分析重作日志中SCN≥StartScn日志文件部分 |
EndScn |
數字型(Number) |
0 |
分析重作日志中SCN≤EndScn日志文件部分 |
StartTime
|
日期型(Date) |
1998-01-01 |
分析重作日志中時間戳≥StartTime的日志文件部分 |
EndTime |
日期型(Date) |
2988-01-01 |
分析重作日志中時間戳≤EndTime的日志文件部分 |
DictFileName |
字符型(VARCHAR2) |
0 |
字典文件,該文件包含一個數據庫目錄的快照。使用該文件可以使得到的分析結果是可以理解的文本形式, |
4、觀察分析結果(v$logmnr_contents)
一共有四個表,詳細說明如下
V$LOGMNR_DICTIONARY-------查詢使用的數據字典文件
V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數
V$LOGMNR_LOGS-------查詢分析的日志文件
V$LOGMNR_CONTENTS-------日志文件的內容
到現在為止,我們已經分析得到了重作日志文件中的內容。動態性能視圖v$logmnr_contents包含logminer分析得到的所有的信息。
SELECT scn,timestamp,sql_redo FROM v$logmnr_contents;
如果我們僅僅想知道某個用戶對于某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到用戶DB_ZGXT對表SB_DJJL所作的一切工作。
SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='DB_ZGXT' AND seg_name='SB_DJJL';
需要強調一點的是,視圖v$logmnr_contents中的分析結果僅在我們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是因為所有的logminer存儲都在PGA內存中,所有其他的進程是看不到它的,同時隨著進程的結束,分析結果也隨之消失。
最后,使用過程DBMS_LOGMNR.END_LOGMNR終止日志分析事務,此時PGA內存區域被清除,分析結果也隨之不再存在。
四、其他注意事項
我們可以利用logminer日志分析工具來分析其他數據庫實例產生的重作日志文件,而不僅僅用來分析本身安裝logminer的數據庫實例的redo logs文件。使用logminer分析其他數據庫實例時,有幾點需要注意:
1. logminer必須使用被分析數據庫實例產生的字典文件,而不是安裝logminer的數據庫產生的字典文件,另外必須保證安裝logminer數據庫的字符集和被分析數據庫的字符集相同。
2. 被分析數據庫平臺必須和當前logminer所在數據庫平臺一樣,也就是說如果我們要分析的文件是由運行在UNIX平臺上的Oracle 9i產生的,那么也必須在一個運行在UNIX平臺上的Oracle實例上運行logminer,而不能在其他如Microsoft NT上運行logminer。當然兩者的硬件條件不一定要求完全一樣。
3. logminer日志分析工具僅能夠分析Oracle 8以后的產品,對于8以前的產品,該工具也無能為力。
五、結語
logminer對于數據庫管理員(DBA)來講是個功能非常強大的工具,也是在日常工作中經常要用到的一個工具,借助于該工具,可以得到大量的關于數據庫活動的信息。其中一個最重要的用途就是不用全部恢復數據庫就可以恢復數據庫的某個變化。另外,該工具還可用來監視或者審計用戶的活動,如你可以利用logminer工具察看誰曾經修改了那些數據以及這些數據在修改前的狀態。我們也可以借助于該工具分析任何Oracle 8及其以后版本產生的重作日志文件。另外該工具還有一個非常重要的特點就是可以分析其他數據庫的日志文件。總之,該工具對于數據庫管理員來講,是一個非常有效的工具,深刻理解及熟練掌握該工具,對于每一個數據庫管理員的實際工作是非常有幫助的。
補充一下Oracle9i 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的原始更新語句,而在之前我們只能選出所有的更新語句。