由于需要,學(xué)習(xí)了Oracle日志分析工具LogMiner的使用,在此記錄一下:
1,確定你的Oracle安裝的目錄,下面用%ORALCE_HOME%表示。
2,必須以DBA角色登錄,命令如下
SQL>sqlplus /nolog
SQL>conn sys/manager@wymis as sysdba
3,(如果第一次做日志分析)安裝LogMiner
SQL> @%ORALCE_HOME%\ora90\rdbms\admin\dbmslm.sql
SQL> @%ORALCE_HOME%\ora90\rdbms\admin\dbmslmd.sql
4,設(shè)置UTL_FILE_DIR值,這個(gè)值表示存放日志分析相關(guān)文件的目錄,設(shè)置方法可以到Oracle的企業(yè)管理器下面設(shè)置,這個(gè)值的例子如c:\log,注意,最后沒(méi)有\(zhòng)符號(hào)。設(shè)置完后,需要重新啟動(dòng)數(shù)據(jù)庫(kù)。
5,生成數(shù)據(jù)字典
SQL> execute dbms_logmnr_d.build(-
> dictionary_filename => 'logminer_dict.dat',-
> dictionary_location => 'c:\import');
注意上面每行代碼后有一個(gè)'-'符號(hào),表示輸入還沒(méi)有結(jié)束。
注意,dictionary_location的值必須與第4步中UTL_FILE_DIR的值一樣。
6,創(chuàng)建要分析的日志文件列表,
創(chuàng)建列表
SQL> EXECUTE dbms_logmnr.add_logfile(-
LogFileName=>' e:\Oracle\oradata\sxf\redo01.log',-
Options=>dbms_logmnr.new);
添加其他日志文件到列表
SQL> EXECUTE dbms_logmnr.add_logfile(
LogFileName=>' e:\Oracle\oradata\sxf\redo02.log',
Options=>dbms_logmnr.addfile);
注意,LogFileName的值可以到相應(yīng)的數(shù)據(jù)庫(kù)實(shí)例文件夾下面的實(shí)例獲得。
7,使用LogMiner進(jìn)行日志分析
SQL> execute dbms_logmnr.start_logmnr(-
> dictfilename => 'c:\import\logminer_dict.dat',-
> starttime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS'),-
> endtime => to_date('2009-10-30 00:00:00','YYYY-MM-DD HH24:MI:SS'));
注意,這里的starttime和endtime的范圍必須是你的日志文件涉及的范圍。如果實(shí)在拿不準(zhǔn),可以不用這兩個(gè)參數(shù)。
8,分析結(jié)果
LogMiner分析的結(jié)果存放在v$LogMnr_Contents表里面。具體的分析,網(wǎng)上有很多好的文章,就不再寫了。
再轉(zhuǎn)一篇比較好的文章,來(lái)自http://www.oracle.com.cn/viewthread.php?tid=22975的 robertmao_2003
作為Oracle DBA,我們有時(shí)候需要追蹤數(shù)據(jù)誤刪除或用戶的惡意操作情況,此時(shí)我們不僅需要查出執(zhí)行這些操作的數(shù)據(jù)庫(kù)賬號(hào),還需要知道操作是由哪臺(tái)客戶端(IP地址 等)發(fā)出的。針對(duì)這些問(wèn)題,一個(gè)最有效實(shí)用而又低成本的方法就是分析Oracle數(shù)據(jù)庫(kù)的日志文件。本文將就Oracle日志分析技術(shù)做深入探討。
一、如何分析即LogMiner解釋
從目前來(lái)看,分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner來(lái)進(jìn)行, Oracle數(shù)據(jù)庫(kù)的所有更改都記錄在日志中,但是原始的日志信息我們根本無(wú)法看懂,而LogMiner就是讓我們看懂日志信息的工具。從這一點(diǎn)上看,它 和tkprof差不多,一個(gè)是用來(lái)分析日志信息,一個(gè)則是格式化跟蹤文件。通過(guò)對(duì)日志的分析我們可以實(shí)現(xiàn)下面的目的:
1、查明數(shù)據(jù)庫(kù)的邏輯更改;
2、偵察并更正用戶的誤操作;
3、執(zhí)行事后審計(jì);
4、執(zhí)行變化分析。
不僅如此,日志中記錄的信息還包括:數(shù)據(jù)庫(kù)的更改歷史、更改類型(INSERT、UPDATE、DELETE、DDL等)、更改對(duì)應(yīng)的SCN號(hào)、以及執(zhí)行 這些操作的用戶信息等,LogMiner在分析日志時(shí),將重構(gòu)等價(jià)的SQL語(yǔ)句和UNDO語(yǔ)句(分別記錄在V$LOGMNR_CONTENTS視圖的 SQL_REDO和SQL_UNDO中)。這里需要注意的是等價(jià)語(yǔ)句,而并非原始SQL語(yǔ)句,例如:我們最初執(zhí)行的是“delete a where c1 <>'cyx';”,而LogMiner重構(gòu)的是等價(jià)的6條DELETE語(yǔ)句。所以我們應(yīng)該意識(shí)到V$LOGMNR_CONTENTS視圖中 顯示的并非是原版的現(xiàn)實(shí),從數(shù)據(jù)庫(kù)角度來(lái)講這是很容易理解的,它記錄的是元操作,因?yàn)橥瑯邮恰癲elete a where c1 <>'cyx';”語(yǔ)句,在不同的環(huán)境中,實(shí)際刪除的記錄數(shù)可能各不相同,因此記錄這樣的語(yǔ)句實(shí)際上并沒(méi)有什么實(shí)際意義,LogMiner重 構(gòu)的是在實(shí)際情況下轉(zhuǎn)化成元操作的多個(gè)單條語(yǔ)句。
另外由于Oracle重做日志中記錄的并非原始的對(duì)象(如表以及其中的列)名稱,而只是它們?cè)贠racle數(shù)據(jù)庫(kù)中的內(nèi)部編號(hào)(對(duì)于表來(lái)說(shuō)是它們?cè)跀?shù)據(jù)庫(kù) 中的對(duì)象ID,而對(duì)于表中的列來(lái)說(shuō),對(duì)應(yīng)的則是該列在表中的排列序號(hào):COL 1, COL 2 等),因此為了使LogMiner重構(gòu)出的SQL語(yǔ)句易于識(shí)別,我們需要將這些編號(hào)轉(zhuǎn)化成相應(yīng)的名稱,這就需要用到數(shù)據(jù)字典(也就說(shuō)LogMiner本身 是可以不用數(shù)據(jù)字典的,詳見(jiàn)下面的分析過(guò)程),LogMiner利用DBMS_LOGMNR_D.BUILD()過(guò)程來(lái)提取數(shù)據(jù)字典信息。
LogMiner包含兩個(gè)PL/SQL包和幾個(gè)視圖:
1、dbms_logmnr_d包,這個(gè)包只包括一個(gè)用于提取數(shù)據(jù)字典信息的過(guò)程,即dbms_logmnr_d.build()過(guò)程。
2、dbms_logmnr包,它有三個(gè)過(guò)程:
add_logfile(name varchar2, options number) - 用來(lái)添加/刪除用于分析的日志文件;
start_logmnr(start_scn number, end_scn number, start_time number,end_time number, dictfilename varchar2, options number) - 用來(lái)開(kāi)啟日志分析,同時(shí)確定分析的時(shí)間/SCN窗口以及確認(rèn)是否使用提取出來(lái)的數(shù)據(jù)字典信息。
end_logmnr() - 用來(lái)終止分析會(huì)話,它將回收LogMiner所占用的內(nèi)存。
與LogMiner相關(guān)的數(shù)據(jù)字典。
1、v$logmnr_dictionary,LogMiner可能使用的數(shù)據(jù)字典信息,因logmnr可以有多個(gè)字典文件,該視圖用于顯示這方面信息。
2、v$logmnr_parameters,當(dāng)前LogMiner所設(shè)定的參數(shù)信息。
3、v$logmnr_logs,當(dāng)前用于分析的日志列表。
4、v$logmnr_contents,日志分析結(jié)果。
二、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ù)打開(kāi)的狀態(tài)下,如果使用了LogMiner的DDL_DICT_TRACKING選項(xiàng),Oracle9i的 LogMiner將自動(dòng)對(duì)比最初的日志流和當(dāng)前系統(tǒng)的數(shù)據(jù)字典,并返回正確的DDL語(yǔ)句,并且會(huì)自動(dòng)偵察并標(biāo)記當(dāng)前數(shù)據(jù)字典和最初日志流之間的差別,這樣 即使最初日志流中所涉及的表已經(jīng)被更改或者根本已經(jīng)不存在,LogMiner同樣會(huì)返回正確的DDL語(yǔ)句。
5、在日志中記錄更多列信息的能力:例如對(duì)于UPDATE操作不僅會(huì)記錄被更新行的情況,還可以捕捉更多前影信息。
6、支持基于數(shù)值的查詢:Oracle9i LogMiner在支持原有基于元數(shù)據(jù)(操作、對(duì)象等)查詢的基礎(chǔ)上,開(kāi)始支持基于實(shí)際涉及到的數(shù)據(jù)的查詢。例如涉及一個(gè)工資表,現(xiàn)在我們可以很容易地查 出員工工資由1000變成2000的原始更新語(yǔ)句,而在之前我們只能選出所有的更新語(yǔ)句。
三、Oracle8i/9i的日志分析過(guò)程
LogMiner只要在實(shí)例起來(lái)的情況下都可以運(yùn)行,LogMiner使用一個(gè)字典文件來(lái)實(shí)現(xiàn)Oracle內(nèi)部對(duì)象名稱的轉(zhuǎn)換,如果沒(méi)有這個(gè)字典文件,則直接顯示內(nèi)部對(duì)象編號(hào),例如我們執(zhí)行下面的語(yǔ)句:
delete from "C"."A" where "C1" = ‘gototop’ and ROWID = 'AAABg1AAFAAABQaAAH';
如果沒(méi)有字典文件,LogMiner分析出來(lái)的結(jié)果將是:
delete from "UNKNOWN"."OBJ# 6197" where "COL 1" = HEXTORAW('d6a7d4ae') and ROWID
= 'AAABg1AAFAAABQaAAH';
如果想要使用字典文件,數(shù)據(jù)庫(kù)至少應(yīng)該出于MOUNT狀態(tài)。然后執(zhí)行dbms_logmnr_d.build過(guò)程將數(shù)據(jù)字典信息提取到一個(gè)外部文件中。下面是具體分析步驟:
1、確認(rèn)設(shè)置了初始化參數(shù):UTL_FILE_DIR,并確認(rèn)Oracle對(duì)改目錄擁有讀寫權(quán)限,然后啟動(dòng)實(shí)例。示例中UTL_FILE_DIR參數(shù)如下:
SQL> show parameter utl
NAME? ?? ?? ?? ?? ?? ?? ?? ? TYPE? ?? ???VALUE
------------------------ ----------- ------------------------------
utl_file_dir? ?? ?? ?? ?? ???string? ?? ?/data6/cyx/logmnr
這個(gè)目錄主要用于存放dbms_logmnr_d.build過(guò)程所產(chǎn)生的字典信息文件,如果不用這個(gè),則可以不設(shè),也就跳過(guò)下面一步。
2、生成字典信息文件:
exec dbms_logmnr_d.build(dictionary_filename =>'
dic.ora',dictionary_location => '/data6/cyx/logmnr');
其中dictionary_location指的是字典信息文件的存放位置,它必須完全匹配UTL_FILE_DIR的值,例如:假設(shè) UTL_FILE_DIR=/data6/cyx/logmnr/,則上面這條語(yǔ)句會(huì)出錯(cuò),只因?yàn)閁TL_FILE_DIR后面多了一個(gè)“/”,而在很多 其它地方對(duì)這一“/”是不敏感的。
dictionary_filename指的是放于字典信息文件的名字,可以任意取。當(dāng)然我們也可以不明確寫出這兩個(gè)選項(xiàng),即寫成:
exec dbms_logmnr_d.build('dic.ora','/data6/cyx/logmnr');
如果你第一步的參數(shù)沒(méi)有設(shè),而直接開(kāi)始這一步,Oracle會(huì)報(bào)下面的錯(cuò)誤:
ERROR at line 1:
ORA-01308: initialization parameter utl_file_dir is not set
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 923
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 1938
ORA-06512: at line 1
需要注意的是,在oracle817 for Windows版中會(huì)出現(xiàn)以下錯(cuò)誤:
14:26:05 SQL> execute dbms_logmnr_d.build('oradict.ora','c:\oracle\admin\ora\log');
BEGIN dbms_logmnr_d.build('oradict.ora','c:\oracle\admin\ora\log'); END;
*
ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 793
ORA-06512: at line 1
解決辦法:
編輯"$ORACLE_HOME/rdbms/admindbmslmd.sql"文件,把其中的
TYPE col_desc_array IS VARRAY(513) OF col_description;
改成:
TYPE col_desc_array IS VARRAY(700) OF col_description;
保存文件,然后執(zhí)行一遍這個(gè)腳本:
15:09:06 SQL> @c:\oracle\ora81\rdbms\admin\dbmslmd.sql
Package created.
Package body created.
No errors.
Grant succeeded.
然后重新編譯DBMS_LOGMNR_D包:
15:09:51 SQL> alter package DBMS_LOGMNR_D compile body;
Package body altered.
之后重新執(zhí)行dbms_logmnr_d.build即可:
15:10:06 SQL> execute dbms_logmnr_d.build('oradict.ora','c:\oracle\admin\ora\log');
PL/SQL procedure successfully completed.
3、添加需要分析的日志文件
SQL>exec dbms_logmnr.add_logfile( logfilename=>'
/data6/cyx/rac1arch/arch_1_197.arc', options=>

bms_logmnr.new);
PL/SQL procedure successfully completed.
這里的options選項(xiàng)有三個(gè)參數(shù)可以用:
NEW - 表示創(chuàng)建一個(gè)新的日志文件列表
ADDFILE - 表示向這個(gè)列表中添加日志文件,如下面的例子
REMOVEFILE - 和addfile相反。
SQL> exec dbms_logmnr.add_logfile( logfilename=>'
/data6/cyx/rac1arch/arch_2_86.arc', options=>

bms_logmnr.addfile);
PL/SQL procedure successfully completed.
4、當(dāng)你添加了需要分析的日志文件后,我們就可以讓LogMiner開(kāi)始分析了:
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora');
PL/SQL procedure successfully completed.
如果你沒(méi)有使用字典信息文件(此時(shí)我們只需要啟動(dòng)實(shí)例就可以了),那么就不需要跟dictfilename參數(shù):
SQL> exec dbms_logmnr.start_logmnr();
PL/SQL procedure successfully completed.
當(dāng)然dbms_logmnr.start_logmnr()過(guò)程還有其它幾個(gè)用于定義分析日志時(shí)間/SCN窗口的參數(shù),它們分別是:
STARTSCN / ENDSCN - 定義分析的起始/結(jié)束SCN號(hào),
STARTTIME / ENDTIME - 定義分析的起始/結(jié)束時(shí)間。
例如下面的過(guò)程將只分析從 '2003-09-21 09:39:00'到'2003-09-21 09:45:00'這段時(shí)間的日志:
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora' , -
starttime => '2003-09-21 09:39:00',endtime => '2003-09-21 09:45:00');
PL/SQL procedure successfully completed.
上面過(guò)程第一行結(jié)尾的“-”表示轉(zhuǎn)行,如果你在同一行,則不需要。我們可以看到有效日志的時(shí)間戳:
SQL> select distinct timestamp from v$logmnr_contents;
TIMESTAMP
-------------------
2003-09-21 09:40:02
2003-09-21 09:42:39
這里需要注意的是,因?yàn)槲抑耙呀?jīng)設(shè)置NLS_DATE_FORMAT環(huán)境變量,所以上面的日期可以直接按這個(gè)格式寫就行了,如果你沒(méi)有設(shè),則需要使用to_date函數(shù)來(lái)轉(zhuǎn)換一下。
SQL> !env|grep NLS
NLS_LANG=american_america.zhs16cgb231280
NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
ORA_NLS33=/oracle/oracle9/app/oracle/product/9.2.0/ocommon/nls/admin/data
使用to_date的格式如下:
exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora',-
starttime => to_date('2003-09-21 09:39:00','YYYY-MM-DD HH24:MI:SS'),-
endtime => to_date('2003-09-21 09:45:00','YYYY-MM-DD HH24:MI:SS'));
STARTSCN 和ENDSCN參數(shù)使用方法類似。
5、好了,在上面的過(guò)程執(zhí)行結(jié)束之后,我們就可以通過(guò)訪問(wèn)與LogMiner相關(guān)的幾個(gè)視圖來(lái)提取我們需要的信息了。其中在v$logmnr_logs中 可以看到我們當(dāng)前分析的日志列表,如果數(shù)據(jù)庫(kù)有兩個(gè)實(shí)例(即OPS/RAC),在v$logmnr_logs中會(huì)有兩個(gè)不同的THREAD_ID。
而真正的分析結(jié)果是放在v$logmnr_contents中,這里面有很多信息,我們可以根據(jù)需要追蹤我們感興趣的信息。后面我將單獨(dú)列出來(lái)講常見(jiàn)的追蹤情形。
6、全部結(jié)束之后,我們可以執(zhí)行dbms_logmnr.end_logmnr過(guò)程退出LogMiner分析過(guò)程,你也可以直接退出SQL*PLUS,它會(huì)自動(dòng)終止。
四、如何利用LogMiner分析Oracle8的日志文件
雖然說(shuō)LogMiner是Oracle8i才推出來(lái),但我們同樣可以用它來(lái)分析Oracle8的日志文件,只不過(guò)稍微麻煩了一點(diǎn),并且有一定的限制,下面是具體做法:
我們首先復(fù)制Oracle8i的$ORACLE_HOME/rdbms/admin/dbmslmd.sql腳本到Oracle8數(shù)據(jù)庫(kù)所在主機(jī)的同樣目 錄;這個(gè)腳本用于創(chuàng)建dbms_logmnr_d包(注意,Oracle9i中還將創(chuàng)建dbms_logmnr包),如果是8.1.5腳本名字為 dbmslogmnrd.sql。然后在Oracle8的數(shù)據(jù)庫(kù)上運(yùn)行這個(gè)腳本,之后使用dbms_logmnr_d.build過(guò)程創(chuàng)建字典信息文件。 現(xiàn)在我們就可以把Oracle8的歸檔日志連同這個(gè)字典信息文件復(fù)制到Oracle8i數(shù)據(jù)庫(kù)所在的主機(jī)上,之后在Oracle8i數(shù)據(jù)庫(kù)中從上面分析過(guò) 程的第三步開(kāi)始分析Oracle8的日志,不過(guò)
dbms_logmnr.start_logmnr()中使用的是Oracle8的字典信息文件。
按照我前面所說(shuō)的那樣,如果不是字典文件,我們則可以直接將Oracle8的歸檔日志復(fù)制到Oracle8i數(shù)據(jù)庫(kù)所在主機(jī),然后對(duì)它進(jìn)行分析。
其實(shí)這里涉及到了一個(gè)跨平臺(tái)使用LogMiner的問(wèn)題,筆者做過(guò)試驗(yàn),也可以在Oracle9i中來(lái)分析Oracle8i的日志。但這些都是有所限制的,主要表現(xiàn)在:
1、LogMiner所使用的字典文件必須和所分析的日志文件是同一個(gè)數(shù)據(jù)庫(kù)所產(chǎn)生的,并且該數(shù)據(jù)庫(kù)的字符集應(yīng)和執(zhí)行LogMiner數(shù)據(jù)庫(kù)的相同。這很好理解,如果不是同一個(gè)數(shù)據(jù)庫(kù)所產(chǎn)生就不存在對(duì)應(yīng)關(guān)系了。
2、生成日志的數(shù)據(jù)庫(kù)硬件平臺(tái)和執(zhí)行LogMiner數(shù)據(jù)庫(kù)的硬件平臺(tái)要求一致,操作系統(tǒng)版本可以不一致。筆者做試驗(yàn)時(shí)(如果讀者有興趣可以到我網(wǎng)站
http://www.ncn.cn上下載試驗(yàn)全過(guò)程,因?yàn)樘L(zhǎng)就不放在這里了),所用的兩個(gè)數(shù)據(jù)庫(kù)操作系統(tǒng)都是Tru64 UNIX,但一個(gè)是 V5.1A,另一個(gè)則是V4.0F。如果操作系統(tǒng)不一致則會(huì)出現(xiàn)下面的錯(cuò)誤:
ORA-01284: file /data6/cyx/logmnr/arch_1_163570.arc cannot be opened
ORA-00308: cannot open archived log '/data6/cyx/logmnr/arch_1_163570.arc'
ORA-27048: skgfifi: file header information is invalid
ORA-06512: at "SYS.DBMS_LOGMNR", line 63
ORA-06512: at line 1
五、分析v$logmnr_contents
前面我們已經(jīng)知道了LogMiner的分析結(jié)果是放在v$logmnr_contents中,這里面有很多信息,我們可以根據(jù)需要追蹤我們感興趣的信息。那么我們通常感興趣的有哪些呢?
1、追蹤數(shù)據(jù)庫(kù)結(jié)構(gòu)變化情況,即DDL操作,如前所述,這個(gè)只有Oracle9i才支持:
SQL> select timestamp,sql_redo from v$logmnr_contents2
where upper(sql_redo) like '%CREATE%';
TIMESTAMP
-------------------
SQL_REDO
-------------------------
2003-09-21 10:01:55
create table t (c1 number);
2、追蹤用戶誤操作或惡意操作:
例如我們現(xiàn)實(shí)中有這樣需求,有一次我們發(fā)現(xiàn)一位員工通過(guò)程序修改了業(yè)務(wù)數(shù)據(jù)庫(kù)信息,把部分電話的收費(fèi)類型改成免費(fèi)了,現(xiàn)在就要求我們從數(shù)據(jù)庫(kù)中查出到底是 誰(shuí)干的這件事?怎么查?LogMiner提供了我們分析日志文件的手段,其中v$logmnr_contents的SESSION_INFO列包含了下面 的信息:
login_username=NEW_97
client_info= OS_username=oracle8 Machine_name=phoenix1
OS_terminal=ttyp3 OS_process_id=8004 OS_program name=sqlplus@phoenix1
(TNS V1-V3)
雖然其中信息已經(jīng)很多了,但在我們的業(yè)務(wù)數(shù)據(jù)庫(kù)中,程序是通過(guò)相同的login_username登錄數(shù)據(jù)庫(kù)的,這樣單從上面的信息是很難判斷的。
不過(guò)我們注意到,因?yàn)楣緫?yīng)用服務(wù)器不是每個(gè)人都有權(quán)限在上面寫程序的,一般惡意程序都是直接通過(guò)他自己的PC連到數(shù)據(jù)庫(kù)的,這就需要一個(gè)準(zhǔn)確的定位。 IP追蹤是我們首先想到的,并且也滿足我們的實(shí)際要求,因?yàn)楣緝?nèi)部IP地址分配是統(tǒng)一管理的,能追蹤到IP地址我們就可以準(zhǔn)確定位了。但從面的 SESSION_INFO中我們并不能直接看到IP,不過(guò)我們還是有辦法的,因?yàn)檫@個(gè)SESSION_INFO里面的內(nèi)容其實(shí)是日志從V$SESSION 視圖里提取的,我們可以在生產(chǎn)數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)追蹤客戶端IP地址的觸發(fā)器:
create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
/
現(xiàn)在,我們就可以在V$SESSION視圖的CLIENT_INFO列中看到新登錄的客戶端IP地址了。那么上面的提出的問(wèn)題就可以迎刃而解了。假如被更新的表名為HMLX,我們就可以通過(guò)下面的SQL來(lái)找到所需信息:
SQL > select session_info ,sql_redo from v$logmnr_contents
2 where upper(operation) = 'UPDATE'??and upper(sql_redo) like '%HMLX%'
3 /
SESSION_INFO
-----------------------------------------
SQL_REDO
-----------------------------------------
login_username=C client_info=10.16.98.26 OS_username=sz-xjs-chengyx Machine_name
=GDTEL\SZ-XJS-CHENGYX
update "C"."HMLX" set "NAME" = 'free' where "NAME" = 'ncn.cn' and ROWID = 'AAABhTAA
FAAABRaAAE';
好了,到此為止,這篇文章就要結(jié)束了,如果讀者朋友還有什么疑問(wèn),可以登錄我的個(gè)人網(wǎng)站(www.ncn.cn)來(lái)獲得最新消息,也可以通過(guò)MSN(gototop_ncn@hotmail.com)直接和我聯(lián)系。
六、參考資料:
1、Technical White Paper Oracle9i LogMiner
2、Metalink文檔:How to Setup LogMiner(文檔ID:111886.1)
文章來(lái)源:
http://localhost/wp2/?p=50