Oracle Logminer數據庫日誌分析詳解

轉:http://blog.csdn.net/tianlesoftware/archive/2010/05/19/5604497.aspx

Logminer是oracle從8i開始提供的用於分析重做日誌信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D兩個package,後邊的D是字典的意思。它既能分析redo log file,也能分析歸檔後的archive log file。在分析日誌的過程中需要使用數據字典,一般先生成數據字典文件後使用,10g以後的版本還可以使用在線數據字典。

Logminer可以分析其它數據庫的重做日誌文件,但是必須使用重做日誌所在數據庫的數據字典,否則會出現無法識別的亂碼。另外被分析數據庫的操作系統平臺最好和當前Logminer所在數據庫的運行平臺一樣,且block size相同。


LogMiner用於分析重做日誌和歸檔日誌所記載的事務操作。


一、確定數據庫的邏輯損壞時間。假定某個用戶執行drop table誤刪除了重要表sales,通過LogMiner可以準確定位該誤操作的執行時間和SCN值,然後通過基於時間恢復或者基於SCN恢復可以完全恢復該表數據。


二、確定事務級要執行的精細邏輯恢復操作。假定某些用戶在某表上執行了一系列DML操作並提交了事務,並且其中某個用戶的DML操作存在錯誤。通過LogMiner可以取得任何用戶的DML操作及相應的UNDO操作,通過執行UNDO操作可以取消用戶的錯誤操作。
三、執行後續審計。通過LogMiner可以跟蹤Oracle數據庫的所有DML、DDL和DCL操作,從而取得執行這些操作的時間順序、執行這些操作的用戶等信息。


1、LogMiner基本對象
 源數據庫(source database):該數據庫是指包含了要分析重做日誌和歸檔日誌的產品數據庫。
  分析數據庫(mining database):該數據庫是指執行LogMiner操作所要使用的數據庫。        
  LogMiner字典:LogMiner字典用於將內部對象ID號和數據類型轉換爲對象名和外部數據格式。使用LogMiner分析重做日誌和歸檔日誌時,應該生成LogMiner字典,否則將無法讀懂分析結果。

2、LogMiner配置要求
(1)源數據庫和分析數據庫(源數據庫和分析數據庫可以是同一個數據庫)
源數據庫和分析數據庫必須運行在相同硬件平臺上;
分析數據庫可以是獨立數據庫或源數據庫;
分析數據庫的版本不能低於源數據庫的版本;
分析數據庫與源數據庫必須具有相同的字符集。

(2)LogMiner字典:LogMiner字典必須在源數據庫中生成。

(3)重做日誌文件
當分析多個重做日誌和歸檔日誌時,它們必須是同一個源數據庫的重做日誌和歸檔日誌;
當分析多個重做日誌和歸檔日誌時,它們必須具有相同的resetlogs  scn;
當分析的重做日誌和歸檔日誌必須在Oracle8.0版本以上。

3、補充日誌(suppplemental logging)
重做日誌用於實現例程恢復和介質恢復,這些操作所需要的數據被自動記錄在重做日誌中。但是,重做應用可能還需要記載其他列信息到重做日誌中,記錄其他列的日誌過程被稱爲補充日誌。

默認情況下,Oracle數據庫沒有提供任何補充日誌,從而導致默認情況下LogMiner無法支持以下特徵:
索引簇、鏈行和遷移行;
直接路徑插入;
摘取LogMiner字典到重做日誌;
跟蹤DDL;
生成鍵列的SQL_REDO和SQL_UNDO信息;
LONG和LOB數據類型。

因此,爲了充分利用LogMiner提供的特徵,必須激活補充日誌。在數據庫級激活補充日誌的示例如下:
SQL> conn /as sysdba
已連接。
SQL> alter database add supplemental log data;
數據庫已更改。

注意:這激活不用重啓數據庫,數據庫聯機即可。


4、LogMiner支持的數據類型和表存儲屬性

char、nchar、varchar2、varchar、nvarchar2;
number;
date、timestamp、timestamp with time zone、timestamp with local time zone;
interval year to month、interval day to second;
raw;
clob、nclob、blob;
long、long raw;
binary_float、binary_double;
函數索引;
沒有lob列的索引組織表(IOT)。

5、LogMiner不支持的數據類型和表存儲屬性
bfile;
抽象數據類型;
集合類型(嵌套表和varray);
參照對象;
xmltype;
具有LOB列的索引組織表;
使用compress特徵的表。

提供LogMiner字典有3種選項:

1、使用源數據庫數據字典(Online Catalog)
使用源數據庫分析重做日誌或歸檔日誌時,如果要分析表的結構沒有發生任何變化,Oracle建議使用該選項分析重做日誌和歸檔日誌。爲了使LogMiner使用當前數據庫的數據字典,啓動LogMiner時應執行如下操作:
SQL> execute dbms_logmnr.start_logmnr (options=>dbms_logmnr.dict_from_online_catalog);

需要注意,dbms_logmnr.dict_from_online_catalog要求數據庫必須處於open狀態,並且該選項只能用於跟蹤DML操作,而不能用於跟蹤DDL操作。(本人一般用這種查DML操作)

2、摘取LogMiner字典到重做日誌
使用分析數據庫分析重做日誌或歸檔日誌,或者被分析表的結構發生改變時,Oracle建議使用該選項分析重做日誌和歸檔日誌。爲了摘取LogMiner字典到重做日誌,要求源數據庫必須處於archivelog模式,並且該數據庫處於open狀態。示例如下:
SQL> execute dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
(本人比較少用這種方式)

3、摘取LogMiner字典到字典文件
字典文件用於存放對象ID號和對象名信息,該選項是爲了與早期版本兼容而保留的。需要注意,使用字典文件分析重做日誌時,如果要分析新建的對象。必須重新建立字典文件。如下所示:
SQL> execute dbms_logmnr_d.build ('dict.ora','d:\demo',dbms_logmnr_d.store_in_flat_file);

(本人一般用這種方式來查DDL的操作記錄,如數據庫沒有配置utl_file_dir參數,需要配置後需要重啓數據庫)

下面使用源數據庫數據字典(Online Catalog)來分析DML操作

1、先進行DML和DDL的操作,以便下面分析。
SQL> conn /as sysdba
已連接。
SQL> show parameter utl;
NAME                                 TYPE        VALUE                         
------------------------------------ ----------- --------
create_stored_outlines               string                                    
utl_file_dir                         string   
SQL> insert into scott.dept  values('80','Dave','AnQing');
已創建 1 行。
SQL> update scott.dept set loc='shang hai' where deptno=70;
已更新 1 行。
SQL> commit;
提交完成。
SQL> delete from scott.dept where deptno=40;
已刪除 1 行。
SQL> commit;
提交完成。
SQL> alter table scott.dept add(phone varchar2(32));
表已更改。
SQL> insert into scott.dept values(50,'David','Dai','13888888888');
已創建 1 行。
SQL> commit;
提交完成。
SQL> alter table scott.dept add(address varchar2(300));
表已更改。

2、把在線重做日誌變成歸檔日誌,這樣分析歸檔日誌就可以了
SQL> alter system switch logfile;
系統已更改。

3、建立日誌分析列表:

----填加要分析的日誌文件
SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。
---繼續填加,用dbms_logmnr.removefile可以刪除
SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。

4、啓動LogMiner
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL 過程已成功完成。

5、查看日誌分析結果:
SQL> col username format a8
SQL> col sql_redo format a50
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
會話已更改。

SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='DEPT';
USERNAME        SCN TIMESTAMP           SQL_REDO
-------- ---------- ------------------- -----------------------------------
            1645927 2009-08-25 16:54:56 delete from "SCOTT"."DEPT" where "DEPTNO" = '40' and "DNAME" = 'OPERATIONS' and "LOC" = 'BOSTON' and "PHONE" IS NULL and "ADDRESS" IS       NULL and ROWID = 'AAAMfNAAEAAAAAQAAD';
SYS         1645931 2009-08-25 16:54:57 alter table scott.dept add(phone varchar2(32)) ;
SYS         1645992 2009-08-25 16:56:33 alter table scott.dept add(address varchar2(300)) ;

6、結束LogMiner
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 過程已成功完成。

---------------------------------------------------------------------------------

用摘取LogMiner字典到字典文件分析DDL操作:

1、進行DDL操作,以便分析
SQL> conn scott/admin
已連接。
SQL> drop table emp;
表已刪除。
SQL> drop table dept;
表已刪除。
SQL> conn /as sysdba
已連接。
SQL> alter system switch logfile;
系統已更改。

2、使用字典文件,請查看數據庫是否配置utl_file_dir,這個參數爲字典文件的目錄。配置該參數後,需要重啓數據庫
SQL> show user;
USER 爲 "SYS"
SQL> show parameter utl;
NAME                                 TYPE        VALUE                         
------------------------------------ ----------- ------------
create_stored_outlines               string                                    
utl_file_dir                         string                          
SQL> alter system set utl_file_dir='D:\oracle\logminer' scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
SQL> show parameter utl
NAME                                 TYPE        VALUE                         
------------------------------------ ----------- -----------
create_stored_outlines               string                                    
utl_file_dir                         string      D:\oracle\logminer     

3、建立字典文件:
SQL> execute dbms_logmnr_d.build ('dict.ora','D:\oracle\logminer',dbms_logmnr_d.store_in_flat_file);
PL/SQL 過程已成功完成。

4、建立日誌分析列表:
SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。

SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);
PL/SQL 過程已成功完成。

5、啓動LogMiner
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\logminer\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
PL/SQL 過程已成功完成。

6、查詢分析日誌結果:

SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents  where lower(sql_redo) like '%table%';
USERNAME        SCN TIMESTAMP      SQL_REDO
-------- ---------- -------------- -----------------------------------
            1647538 25-8月 -09     ALTER TABLE "SCOTT"."EMP" RENAME CONSTRAINT "PK_EMP" TO "BIN$f/mFjN+nTmaYjrb17YU80w==$0" ;
            1647550 25-8月 -09     ALTER TABLE "SCOTT"."EMP" RENAME TO "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
            1647553 25-8月 -09     drop table emp AS "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
            1647565 25-8月 -09     ALTER TABLE "SCOTT"."DEPT" RENAME CONSTRAINT "PK_DEPT" TO "BIN$3imFL+/1SqONFCB7LoPcCg==$0" ;
            1647571 25-8月 -09     ALTER TABLE "SCOTT"."DEPT" RENAME TO "BIN$kYKBLvltRb+vYaT6RkaRiA==$0";
            1647574 25-8月 -09     drop table dept AS "BIN$kYKBLvltRb+vYaT6RkaRiA==$0" ;                        
                                             
或者其他的查詢:

SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where username='SYS';
USERNAME TIMESTAMP           SQL_REDO                                          
-------- ------------------- --------------------------------------------------
USERNAME        SCN TIMESTAMP      SQL_REDO
-------- ---------- -------------- -----------------------------------
SYS         1647487 25-8月 -09     set transaction read write;
SYS         1647488 25-8月 -09     alter user scott account unlock;
SYS         1647490 25-8月 -09     Unsupported
SYS         1647492 25-8月 -09     commit;
                         
7、結束LogMiner
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 過程已成功完成。

注意,v$logmnr_contents內容保存了日誌的內容,只在當前會話有效,如果想長期保存分析,可以在當前會話用create table tablename as select * from v$logmnr_contents語句來持久保存。


其他操作:


1.生成數據字典文件
SQL> show parameter utl_file_dir
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      *
SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dict20090625.dat',dictionary_location => '/orabak');
PL/SQL procedure successfully completed.

2.可以先設置使用的表空間
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('erp') 
PL/SQL procedure successfully completed.

3.開始分析日誌
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/orabak/dict20090625.dat');
PL/SQL procedure successfully completed.

提取特定時間的日誌:
dbms_logmnr.start_logmnr(dictfilename=>'/orabak/dict20090625.dat',
starttime=>to_date('2009-06-24 09:30:00','YYYY-MM-DD HH24:MI:SS'),
endtime=>to_date('2009-06-24 12:00:59','YYYY-MM-DD HH24:MI:SS'))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章