Oracle LogMiner 是Oracle公司從產(chǎn)品8i以后提供的一個實際非常有用的分析工具,使用該工具可以輕松獲得Oracle 重作日志文件(歸檔日志文件)中的具體內(nèi)容,特別是,該工具可以分析出所有對于數(shù)據(jù)庫操作的DML(insert、update、delete等)語句,另外還可分析得到一些必要的回滾SQL語句。該工具特別適用于調(diào)試、審計或者回退某個特定的事務(wù)。
總的說來,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的安裝及使用,我的環(huán)境是WIN2000+ORACLE10R2。
要安裝LogMiner工具,必須首先要運行下面這樣兩個腳本,這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創(chuàng)建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創(chuàng)建DBMS_LOGMNR_D包,該包用來創(chuàng)建數(shù)據(jù)字典文件。
1..$ORACLE_HOME/rdbms/admin/dbmslm.sql 2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql.
SQL> conn sys/sg1980@sgtest2 as sysdba
已連接。
SQL> @$oracle_home/rdbms/admin/dbmslm.sql
SP2-0310: 無法打開文件 "$oracle_home/rdbms/admin/dbmslm.sql"
SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslm.sql
程序包已創(chuàng)建。
授權(quán)成功。
SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslmd.sql
程序包已創(chuàng)建。
使用LogMiner工具
1、創(chuàng)建數(shù)據(jù)字典文件(data-dictionary)
數(shù)據(jù)字典文件是一個文本文件,使用包DBMS_LOGMNR_D來創(chuàng)建。如果我們要分析的數(shù)據(jù)庫中的表有變化,影響到庫的數(shù)據(jù)字典也發(fā)生變化,這時就需要重新創(chuàng)建該字典文件。另外一種情況是在分析另外一個數(shù)據(jù)庫文件的重作日志時,也必須要重新生成一遍被分析數(shù)據(jù)庫的數(shù)據(jù)字典文件。
在ORACLE8I的時候,首先在init.ora初始化參數(shù)文件中,指定數(shù)據(jù)字典文件的位置,也就是添加一個參數(shù)UTL_FILE_DIR,該參數(shù)值為服務(wù)器中放置數(shù)據(jù)字典文件的目錄。如:
UTL_FILE_DIR = (e:\Oracle\logs)
ORACLE9I后,推薦使用SPFILE啟動,可以動態(tài)調(diào)整參數(shù);
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string D:\ORACLE\PRODUCT\10.2.0\DB_2\
DATABASE\SPFILESGTEST2.ORA
SQL> alter system set utl_file_dir=‘d:\oracle\logs‘ scope=spfile;
系統(tǒng)已更改。
SQL> startup force
ORACLE 例程已經(jīng)啟動。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 2945024 bytes
數(shù)據(jù)庫裝載完畢。
數(shù)據(jù)庫已經(jīng)打開。
SQL> show parameter utl_file_dir
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir string d:\oracle\logs
然后創(chuàng)建數(shù)據(jù)字典文件
SQL> @d:\dbms_logmnr_d.build.txt
PL/SQL 過程已成功完成。
腳本dbms_logmnr_d.build.txt
BEGIN
dbms_logmnr_d.build(
dictionary_filename => ‘logminer_dict.dat‘,
dictionary_location => ‘d:\oracle\logs‘);
END;
/
2、創(chuàng)建要分析的日志文件列表
Oracle的重作日志分為兩種,在線(online)和離線(offline)歸檔日志文件,我這里主要分析歸檔日志,在線日志原理一樣。
A.創(chuàng)建列表
SQL> @d:\dbms_logmnr.add_logfile.txt
PL/SQL 過程已成功完成。
腳本dbms_logmnr.add_logfile.txt
BEGIN
dbms_logmnr.add_logfile(
options => dbms_logmnr.new,
logfilename=> ‘D:\oracle\product\10.2.0\flash_recovery_area\SGTEST2\ARCHIVELOG\2006_11_10\O1_MF_1_35_2O7JY3M1_.ARC‘);
END;
/
B.添加另外的日志文件到列表
SQL> @d:\dbms_logmnr.add_logfile2.txt
PL/SQL 過程已成功完成。
腳本dbms_logmnr.add_logfile2.txt
BEGIN
dbms_logmnr.add_logfile(
options => dbms_logmnr.addfile,
logfilename => ‘D:\oracle\product\10.2.0\flash_recovery_area\SGTEST2\ARCHIVELOG\2006_11_09\O1_MF_1_34_2O55BFH4_.ARC‘);
END;
/
注意Options=>dbms_logmnr.new(addfile、removefile)的三個參數(shù),分別是新建、添加、刪除日志。
選取日志文件的操作如下例:
begin sys.dbms_logmnr.add_logfile (logfilename =>‘/oradata/orcl/redo01.log‘, options=>sys.dbms_logmnr.NEW);
end;
一次只能選取一個文件。若要增加文件,使用下例:
begin sys.dbms_logmnr.add_logfile (logfilename =>‘/oradata/orcl/redo01.log‘, options=>sys.dbms_logmnr.ADDFILE);
end;
若想去掉一個已經(jīng)選取或增加的文件,使用REMOVEFILE:
begin sys.dbms_logmnr.add_logfile (logfilename =>‘/oradata/orcl/redo01.log‘, options=>sys.dbms_logmnr.REMOVEFILE);
end;
如此反復(fù)操作,可以把所有要分析的文件都選取進(jìn)去。
3.使用LogMiner進(jìn)行日志分析
(1)無限制條件
BEGIN
dbms_logmnr.start_logmnr(
dictfilename => ‘d:\oracle\logs\logminer_dict.dat‘);
END;
/
(2)有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數(shù)的設(shè)置(參數(shù)含義見表1),可以縮小要分析日志文件的范圍。
參數(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)
字典文件,該文件包含一個
數(shù)據(jù)庫目錄的快照。使用該文件可以使得到的分析結(jié)果是可以理解的文本形式,而非系統(tǒng)內(nèi)部的16進(jìn)制
Options
BINARY_INTEGER
0
系統(tǒng)調(diào)試參數(shù),實際很少使用
例如我沒只需要分許2006年11月10日0點-2006年11月10日2點之間的日志
BEGIN
dbms_logmnr.add_logfile(
options => dbms_logmnr.addfile,
logfilename=> ‘D:\oracle\product\10.2.0\flash_recovery_area\SGTEST2\ARCHIVELOG\2006_11_09\O1_MF_1_34_2O55BFH4_.ARC‘);
END;
/
4、觀察分析結(jié)果(v$logmnr_contents)
到現(xiàn)在為止,我們已經(jīng)分析得到了重作日志文件中的內(nèi)容。動態(tài)性能視圖v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我們僅僅想知道某個用戶對于某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到用戶DB_ZGXT對表SB_DJJL所作的一切工作。
SQL>; SELECT sql_redo FROM v$logmnr_contents WHERE username=‘DB_ZGXT‘ AND tablename=‘SB_DJJL‘;
需要強調(diào)一點的是,視圖v$logmnr_contents中的分析結(jié)果僅在我們運行過程‘dbms_logmrn.start_logmnr‘這個會話的生命期中存在。這是因為所有的LogMiner存儲都在PGA內(nèi)存中,所有其他的進(jìn)程是看不到它的,同時隨著進(jìn)程的結(jié)束,分析結(jié)果也隨之消失。
最后,使用過程DBMS_LOGMNR.END_LOGMNR終止日志分析事務(wù),此時PGA內(nèi)存區(qū)域被清除,分析結(jié)果也隨之不再存在