Oracle高可用之LogMiner

尛樣兒發表於2010-03-25
Oracle高可用之Logmnr

如果有一個DDL操作,你想知道是由哪個使用者發出來的。那麼,只要還有這個時間的歸檔日誌存在,就可以利用Logmnr來分析歸檔日誌。

利用Logmnr可以做如下事情:
查明資料庫的變更記錄,或者是進行變化分析,如有使用者懷疑自己的應用有問題,產生了大量的失誤,可以用Logmnr來分析這些事務,看看到底發生了些什麼事情。
偵察並更正使用者的誤操作,如有的使用者一不小心誤刪除了某個表,但是並不承認,這個時候就可利用Logmnr來分析是誰執行的DML或者是DDL操作。
DDL分析從Oracle 9i開始被支援。
找回失去的資料,當不能使用Flashback或使用Flashback受限的時候,我們可以考慮利用Logmnr來找回資料,這個時候,只需要有歸檔日誌即可。

兩種分析方式:
線上分析:在Oracle 9i之後,就可以利用資料庫的資料字典線上分析,直接在資料庫中分析歸檔、聯機日誌而不需要設定引數並重新啟動資料庫了。
離線分析:可以直接提取到重做日誌流中,它在日誌流中提供了操作當時的資料字典快照,這樣就可以實現離線分析。但是,資料庫並不會把Catalog資訊寫到每個聯機日誌中。在實際使用中,可以透過如下的語句來查詢哪些歸檔日誌寫有資料字典的快照資訊:
select name from v$archived_log where directory_begin=’YES’;
select name from v$archived_log where directory_end=’YES’;
因為這裡僅僅是一個當時的快照資訊,所以,如果我們要分析哪個時段的歸檔日誌,就選擇離這個分析的歸檔日誌最近的、包含DICTIONARY_BEGIN=’YES’的一個日誌,與包含dictionary_end=’YES’的一個日誌一起新增到分析的日誌中,這樣就可以脫離原來的資料庫來分析歸檔日誌了。

注意:
LogMiner分析出來的是後設資料(操作、物件等),如update table set a=a+10;實際影響了1000條資料,那麼Logmnr則返回1000條undo(redo)語句。

Logmnr包含的內容與資料字典
LogMiner包含兩個PL/SQL包和幾個檢視。
dbms_logmnr_d包:用於提取字典資訊到外部平面檔案或者是聯機日誌中去。
dbms_logmnr包:主要包含三個過程。
    add_logfile:用來新增/刪除用於分析的日誌檔案;
    start_logmnr:用來開啟日誌分析,而且,在9i/10g中,可以開啟很多不同的分析選項,如只分析提交資訊COMMITED_DATA_ONLY等;
    end_logmnr:用來終止分析會話,它將回收LogMiner所佔用的記憶體。

如果普通使用者想使用以上的包,必須先在sys中授權才能使用:
grant execute on dbms_logmnr to piner;
在使用的時候最好也帶上字首sys。

與LogMiner相關的資料字典如下:
v$logmnr_dictionary:LogMiner可能使用的資料字典資訊,因logmnr可以有多個字典檔案,該檢視用於顯示這方面的資訊。
v$logmnr_parameters :當前LogMiner所設定的引數資訊。
v$logmnr_logs:當前用於分析的日誌列表。
v$logmnr_contents:日誌分析結果。

這些字典是session相關的,也就是說,你的分析結果在別的會話中是查詢不到的,因為它本身是個臨時表。如果想儲存分析結果,就可以採用create as table tmp_table as select * from v$logmnr_content的方式轉儲v$logmnr_contents的內容。

Logmnr的分析過程
alter system archive log current;
create table test (a int);
insert into test values (1);
insert into test values (2);
insert into test values (3);
commit;
delete from test;
commit;
alter system archive log current;

找出剛才兩次切換之間包含這些操作的歸檔日誌。

線上分析過程:
新增日誌:
exec sys.dbms_logmnr.add_logfile(LogFileName=>’/archive_log/archive/1_9.arc’,-
options=>dbms_logmnr.new);
分析日誌:
exec sys.dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog);

如果還有更多日誌:
exec sys.dbms_logmnr.add_logfile (LogFileName=>’/archive_log/archive/1_10.arc’);

檢視分析結果:
select t.SCN ,t.TIMESTAMP,t.SEG_OWNER,t.OPERATION,
t.SQL_REDO,t.SQL_UNDO
 from v$logmnr_contents t where t.seg_name=’TEST’;

結束分析,清空記憶體:
exec sys.dbms_logmnr.end_logmnr;

預設情況,Oracle 10gv$logmnr_contents臨時表空間使用的是SYSAUX表空間。
可以透過以下語句更改logmnr的特定表空間,防止sysaux表空間出現不夠。
exec sys.dbms_logmnr_d.set_tablespace(‘USERS’);

exec dbms_logmnr.start_logmnr(options =>’dbms_logmnr.dict_from_onlinr_catalog + -
dbms_logmnr.commited_data_only’);
這裡設定了commited_data_only,表示我們只提取已經提交的事務,而不是提取那麼沒有提交的事務。
alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’
exec dbms_logmnr.start_logmnr(dictfilename=>’/oracle/database/dictionary.ora’, -
starttime =>’2007-04-11 08:30:00’,-
endtime=>’ 2007-04-11 08:45:00’);

表示只分析2007-04-11 08:30:00到2007-04-11 08:45:00這個時間段的日誌資訊。

Logmnr的限制 (10gR2中的限制):
BFILE datatype
Simple and nested abstract datatypes (ADTs)
Collections (nested tables and VARRAYs)
Object refs
XMLTYPE datatype
Tables using table compression

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-630421/,如需轉載,請註明出處,否則將追究法律責任。

相關文章