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