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