1. 程式人生 > >Oracle日誌挖掘之LogMiner(前部分原理解釋,後部分實操!)

Oracle日誌挖掘之LogMiner(前部分原理解釋,後部分實操!)


官方文件地址:http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL019


本文轉自:http://blog.itpub.net/26736162/viewspace-2141148/

眾所周知,所有對使用者資料和資料字典的改變都記錄在Oracle的Redo Log中,因此,Redo Log包含了所有進行恢復操作所需要的資訊。但是,原始的Redo Log檔案無法看懂,所以,Oracle從8i以後提供了一個非常有用的分析工具,稱為LogMiner。使用該工具可以輕鬆獲得Redo Log檔案(包含歸檔日誌檔案)中的具體內容。特別是該工具可以分析出所有對於資料庫的DML操作(INSERT、UPDATE、DELETE等)語句。Oracle 9i後可以分析DDL語句,另外還可分析得到一些必要的回滾SQL語句。LogMiner一個最重要的用途就是不用全部恢復資料庫就可以恢復資料庫的某個變化。該工具特別適用於除錯、審計或者回退某個特定的事務。

LogMiner工具既可以用來分析線上日誌,也可以用來分析離線日誌檔案,既可以分析本身自己資料庫的重作日誌檔案,也可以用來分析其它資料庫的重作日誌檔案。當分析其它資料庫的重作日誌檔案時,需要注意的是,LogMiner必須使用被分析資料庫例項產生的字典檔案,而不是安裝LogMiner的資料庫產生的字典檔案,另外,必須保證安裝LogMiner資料庫的字符集和被分析資料庫的字符集相同。源資料庫(Source Database)平臺必須和分析資料庫(Mining Database)平臺一樣。

Oracle通過LogMiner工具對Redo Log進行挖掘,顯示出一系列可讀的資訊,該過程稱為日誌挖掘。LogMiner通過V$LOGMNR_CONTENTS檢視顯示Redo Log中的資訊。

總的說來,LogMiner工具的主要用途有:

1、跟蹤資料庫的變化:可以離線地跟蹤資料庫的變化,而不會影響線上系統的效能

2、回退資料庫的變化:回退特定的變化資料,減少Point-In-Time Recovery的執行

3、優化和擴容計劃:可通過分析日誌檔案中的資料以分析資料的增長模式

4、確定資料庫的邏輯損壞時間:準確定位操作執行的時間和SCN

5、確定事務級要執行的精細邏輯恢復操作,可以取得相應的UNDO操作

6、執行後續審計

(一)安裝LogMiner工具

在預設情況下,Oracle已經安裝了LogMiner工具。若是沒有安裝,則可以執行下面兩個指令碼:

 SQL>@$ORACLE_HOME/rdbms/admin/dbmslm.sql

 SQL>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql

這兩個指令碼必須均以SYS使用者身份執行。其中第一個指令碼用來建立DBMS_LOGMNR包,該包用來分析日誌檔案。第二個指令碼用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案。若要使普通使用者具有日誌挖掘的許可權,則可以執行如下的SQL進行賦權:

GRANT EXECUTE ON  DBMS_LOGMNR TO LHR_TEST;

指令碼執行完畢後,LogMiner包含兩個PL/SQL包和幾個檢視:

1、DBMS_LOGMNR_D包,包括一個用於提取資料字典資訊的過程,即DBMS_LOGMNR_D.BUILD()過程,還包含一個重建LogMiner表的過程,DBMS_LOGMNR_D.SET_TABLESPACE。在預設情況下,LogMiner的表是建在SYSTEM表空間下的。

2、DBMS_LOGMNR包,它有3個儲存過程:

l ADD_LOGFILE(NAME VARCHAR2,OPTIONS NUMBER) 用來新增或刪除用於分析的日誌檔案

l START_LOGMNR(START_SCN NUMBER,END_SCN NUMBER,START_TIME NUMBER,END_TIME NUMBER,DICTFILENAME VARCHAR2,OPTIONS NUMBER) 用來開啟日誌分析,同時確定分析的時間或SCN視窗以及確認是否使用提取出來的資料字典資訊

l END_LOGMNR()儲存過程用來終止分析會話,它將回收LogMiner所佔用的記憶體

與LogMiner相關的資料字典檢視:

l V$LOGHIST:顯示歷史日誌檔案的一些資訊

l V$LOGMNR_DICTIONARY:因為LOGMINER可以有多個字典檔案,所以該檢視顯示字典檔案資訊

l V$LOGMNR_PARAMETERS:顯示LOGMINER的引數

l V$LOGMNR_LOGS:顯示用於分析的日誌列表資訊

l V$LOGMNR_CONTENTS:LOGMINER結果

(二)LogMiner的資料字典

為了完全地轉換Redo Log中的內容,LogMiner需要訪問一個數據庫字典。LogMiner使用該字典將Oracle內部的物件識別符號和資料型別轉換為物件名稱和外部的資料格式。沒有字典,LogMiner將使用16進位制字元顯示內部物件ID。

例如,對於如下的SQL語句:

INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);

在沒有資料字典的情況下,LogMiner將顯示為:

INSERT INTO Object#2581(col#1, col#2) VALUES (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"

LogMiner提供了3種提取字典檔案的方式:

① 將字典檔案提取為一個Flat File(平面檔案或中間介面檔案)

② 將字典檔案提取為Redo Log

③ 使用Online Catalog(聯機日誌)

下面分別介紹這3種方式:

① 將字典檔案提取為一個Flat File(平面檔案或中間介面檔案)

為了將資料庫字典資訊提取為Flat File,需要使用帶有STORE_IN_FLAT_FILE引數的DBMS_LOGMNR_D.BUILD程式。DBMS_LOGMNR_D.BUILD程式需要訪問一個能夠放置字典檔案的目錄。因為PL/SQL 程式通常不能直接訪問使用者目錄,必須手動指定一個由DBMS_LOGMNR_D.BUILD程式使用的目錄。為了指定該目錄,必須修改初始化檔案中的UTL_FILE_DIR引數:

ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle' SCOPE=SPFILE;

然後重新啟動資料庫。確保在建立Flat File檔案的過程中,不能有DDL操作被執行。在建立Flat File檔案時,資料庫必須處於OPEN狀態,然後執行DMBS_LOGMNR_D.BUILD程式:

EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle');

指令碼執行完成後會在/home/oracle下生成一個dictionary.ora的文字檔案。該檔案中包含一系列的建表語句和插入語句。

② 將字典檔案提取為Redo Log

為了將字典檔案提取為Redo日誌,資料庫必須處於OPEN狀態,並且處於歸檔模式。將字典提取為Redo日誌的過程中,資料庫系統不能有DDL語句被執行。為了將字典提取為Redo日誌,需要使用帶有STORE_IN_REDO_FILES引數的DBMS_LOGMNR_D.BUILD程式:

SQL> EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

需要注意的是,將字典檔案提取為Redo檔案的時候需要開啟附加日誌,如下所示:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

在這些Redo日誌被歸檔之後,可以通過查詢V$ARCHIVED_LOG檢視來查詢:

SELECT *

  FROM V$ARCHIVED_LOG A

 WHERE A.NAME IS NOT NULL

   AND (A.DICTIONARY_BEGIN = 'YES' OR A.DICTIONARY_END = 'YES');

如果將字典資訊提取為Redo檔案,那麼在使用DBMD_LOGMNR.ADD_LOGFILE指定所需要分析的日誌檔案時,需要將這些包含字典資訊的Redo檔案也新增進去。同時在使用START_LOGMNR開始分析時,需要指定DICT_FROM_REDO_LOGS的引數。

③ 使用Online Catalog(聯機日誌)

為了使LogMiner直接使用資料庫當前使用的字典,在開始LogMiner時可以指定將聯機目錄作為字典源:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

使用聯機目錄,意味著不需要再提取字典檔案,是開始分析日誌的最快的方式。除了可以分析聯機Redo日誌外,還可以在和產生歸檔日誌檔案相同的系統上分析歸檔日誌檔案。然而,記住聯機目錄只能重建應用於表的最新版本上的SQL語句。一旦表被修改,聯機目錄就無法反映出表之前的版本。這就意味著LogMiner不能重建執行於表的舊版本上的SQL語句。

(三)跟蹤DDL語句

當LogMiner被啟動時,它會自動建立自己的內部字典。如果源字典是Flat File字典或Redo日誌中的字典,則可以使用DDL_DICT_TRACKING引數來跟蹤DDL語句。DDL跟蹤預設是關閉的。為了開啟這一功能,可以在啟動LogMiner時使用DDL_DICT_TRACKING引數:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DDL_DICT_TRACKING);

當使用DDL_DICT_TRACKING時,需要注意如下幾點:

v 當使用聯機目錄(Online catalog)時,也就是當使用DICT_FROM_ONLINE_CATALOG引數時,是不能使用DDL_DICT_TRACKING選項的。

v 使用DDL_DICT_TRACKING時,要求資料庫處於OPEN狀態。

v 儘量為LogMiner的表提供一個單獨的表空間。預設情況下LogMiner的表是建立在SYSTEM表空間中的。使用DBMS_LOGMNR_D.SET_TABLESPACE可以在一個單獨的表空間中重建這些LogMiner的表:SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');。

(四)過濾LogMiner返回的資料

可以使用COMMITTED_DATA_ONLY引數來只顯示那些被提交的事務:

SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.COMMITTED_DATA_ONLY);

當使用這一引數時,LogMiner將所有的DML操作按照事務的關係組合在一起。這些事務按照它們被提交的順序顯示出來。

可以使用SKIP_CORRUPTION引數來忽略redo日誌中的所有錯誤:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.SKIP_CORRUPTION);

可以使用使用STARTTIME和ENDTIME引數按照時間過濾資料,還可以使用STARTSCN和ENDSCN引數按照SCN(System Change Number)來過濾資料。

BEGIN

DBMS_LOGMNR.START_LOGMNR(STARTSCN => 23573690,ENDSCN   => 23632671,OPTIONS  => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);

END;

/

BEGIN

DBMS_LOGMNR.START_LOGMNR(STARTTIME => '2015-06-03 11:10:12',ENDTIME => '2015-06-03 11:13:06',OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);

END;

/

(五)典型的LogMiner步驟

一個典型的LogMiner的操作包含如下步驟:

1、進行初始化設定:開啟附加日誌,設定LogMiner的表空間,設定UTL_FILE_DIR引數的值;

2、提取一個字典:將字典檔案提取為Flat File或Redo日誌,或者直接使用Online Catalog;

3、指定需要分析的Redo日誌檔案:利用DBMS_LOGMNR.ADD_LOGFILE來新增日誌;

4、開始LogMiner:執行DBMS_LOGMNR.START_LOGMNR來啟動LogMiner;

5、查詢V$LOGMNR_CONTENTS檢視;

6、結束LogMiner:通過執行EXECUTE DBMS_LOGMNR.END_LOGMNR來結束分析。

下面給出一個使用Online Catalog作為資料字典進行日誌挖掘的示例:

SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:mi:ss';

Session altered.

SQL> select member from v$logfile;

MEMBER

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

+DATA/orclasm/onlinelog/group_3.263.850260263

+FRA/orclasm/onlinelog/group_3.259.850260267

+DATA/orclasm/onlinelog/group_2.262.850260259

+FRA/orclasm/onlinelog/group_2.258.850260263

+DATA/orclasm/onlinelog/group_1.261.850260255

+FRA/orclasm/onlinelog/group_1.257.850260259

6 rows selected.

SQL> execute dbms_logmnr.add_logfile('+DATA/orclasm/onlinelog/group_1.261.850260255',dbms_logmnr.new);

PL/SQL procedure successfully completed.

SQL> execute dbms_logmnr.add_logfile('+DATA/orclasm/onlinelog/group_2.262.850260259',dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

SQL> execute dbms_logmnr.add_logfile('+DATA/orclasm/onlinelog/group_3.263.850260263',dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);

PL/SQL procedure successfully completed.

SQL> select sql_redo,sql_undo from v$logmnr_contents where table_name='T' and OPERATION='INSERT';

SQL_REDO                               SQL_UNDO

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

insert into "LHR"."T"("ID") values ('1');        delete from "LHR"."T" where "ID" = '1' and ROWID = 'AAAaN7AAEAAAnhjAAA';

insert into "LHR"."T"("ID") values ('2');        delete from "LHR"."T" where "ID" = '2' and ROWID = 'AAAaN7AAEAAAnhjAAB';




1 Logminer簡介

1.1 LogMiner介紹

Oracle LogMiner 是Oracle公司從產品8i以後提供的一個實際非常有用的分析工具,使用該工具可以輕鬆獲得Oracle 線上/歸檔日誌檔案中的具體內容,特別是該工具可以分析出所有對於資料庫操作的DML和DDL語句。該工具特別適用於除錯、審計或者回退某個特定的事務。

LogMiner分析工具實際上是由一組PL/SQL包和一些動態檢視(Oracle8i內建包的一部分)組成,它作為Oracle資料庫的一部分來發布是8i產品提供的一個完全免費的工具。但該工具和其他Oracle內建工具相比使用起來顯得有些複雜,主要原因是該工具沒有提供任何的圖形使用者介面(GUI)。

1.2 LogMiner作用

在Oracle 8i之前,Oracle沒有提供任何協助資料庫管理員來讀取和解釋重作日誌檔案內容的工具。系統出現問題,對於一個普通的資料管理員來講,唯一可以作的工作就是將所有的log檔案打包,然後發給Oracle公司的技術支援,然後靜靜地等待Oracle 公司技術支援給我們最後的答案。然而從8i以後,Oracle提供了這樣一個強有力的工具--LogMiner。

LogMiner 工具即可以用來分析線上,也可以用來分析離線日誌檔案,即可以分析本身自己資料庫的重作日誌檔案,也可以用來分析其他資料庫的重作日誌檔案。

總的說來,LogMiner工具的主要用途有:

1、跟蹤資料庫的變化:可以離線的跟蹤資料庫的變化,而不會影響線上系統的效能。

2、回退資料庫的變化:回退特定的變化資料,減少point-in-time recovery的執行。

3、優化和擴容計劃:可通過分析日誌檔案中的資料以分析資料增長模式

1.3 使用詳解

1.3.1 安裝LogMiner

在使用LogMiner之前需要確認Oracle是否帶有進行LogMiner分析包,一般來說Windows作業系統Oracle10g以上都預設包含。如果不能確認,可以DBA身份登入系統,檢視系統中是否存在執行LogMiner所需要的dbms_logmnr、dbms_logmnr_d包,如果沒有需要安裝LogMiner工具,必須首先要執行下面這樣兩個指令碼:

1、$ORACLE_HOME/rdbms/admin/dbmslm.sql

2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql.

這兩個指令碼必須均以DBA使用者身份執行。其中第一個指令碼用來建立DBMS_LOGMNR包,該包用來分析日誌檔案。第二個指令碼用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案。

建立完畢後將包括如下過程和檢視:

型別

過程名

用途

過程

Dbms_logmnr_d.build

建立一個數據字典檔案

過程

Dbms_logmnr.add_logfile

在類表中增加日誌檔案以供分析

過程

Dbms_logmnr.start_logmnr

使用一個可選的字典檔案和前面確定要分析日誌檔案來啟動LogMiner

過程

Dbms_logmnr.end_logmnr

停止LogMiner分析

檢視

V$logmnr_dictionary

顯示用來決定物件ID名稱的字典檔案的資訊

檢視

V$logmnr_logs

在LogMiner啟動時顯示分析的日誌列表

檢視

V$logmnr_contents

LogMiner啟動後,可以使用該檢視在SQL提示符下輸入SQL語句來查詢重做日誌的內容

1.3.2  建立資料字典檔案

LogMiner工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態效能檢視(檢視是在利用過程DBMS_LOGMNR.START_LOGMNR啟動LogMiner時建立)組成。在使用LogMiner工具分析redo log檔案之前,可以使用DBMS_LOGMNR_D 包將資料字典匯出為一個文字檔案。該字典檔案是可選的,但是如果沒有它,LogMiner解釋出來的語句中關於資料字典中的部分(如表名、列名等)和數值都將是16進位制的形式,我們是無法直接理解的。例如,下面的sql語句:

INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三'); 

LogMiner解釋出來的結果將是下面這個樣子:

insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65')); 

建立資料字典的目的就是讓LogMiner引用涉及到內部資料字典中的部分時為他們實際的名字,而不是系統內部的16進位制。資料字典檔案是一個文字檔案,使用包DBMS_LOGMNR_D來建立。如果我們要分析的資料庫中的表有變化,影響到庫的資料字典也發生變化,這時就需要重新建立該字典檔案。另外一種情況是在分析另外一個數據庫檔案的重作日誌時,也必須要重新生成一遍被分析資料庫的資料字典檔案。

建立資料字典檔案之前需要配置LogMiner資料夾:

1 CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR'; 2 alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;

建立字典檔案需要以DBA使用者登入,建立到上面配置好的LogMiner資料夾中:

1 CONN LOGMINER/ LOGMINER@PRACTICE AS SYSDBA 2 EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');

1.3.3 加入需分析的日誌檔案

Oracle的LogMiner可以分析線上(online)和歸檔(offline)兩種日誌檔案,加入分析日誌檔案使用dbms_logmnr.add_logfile過程,第一個檔案使用dbms_logmnr.NEW引數,後面檔案使用dbms_logmnr.ADDFILE引數。

1、建立列表

1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW); 3 END; 4 /

2、新增其他日誌檔案到列表

1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE); 3 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00003_0817639922.001',options=>dbms_logmnr.ADDFILE); 4 END; 5 /

1.3.4 使用LogMiner進行日誌分析

Oracle的LogMiner分析時分為無限制條件和限制條件兩種,無限制條件中分析所有加入到分析列表日誌檔案,限制條件根據限制條件分析指定範圍日誌檔案。

1、無限制條件

EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');

2、有限制條件

通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同引數的設定(引數含義見表1),可以縮小要分析日誌檔案的範圍。通過設定起始時間和終止時間引數我們可以限制只分析某一時間範圍的日誌。

引數

引數型別

預設值

含義

StartScn

數字型

0

分析重作日誌中SCN≥StartScn日誌檔案部分

EndScn

數字型

0

分析重作日誌中SCN≤EndScn日誌檔案部分

StartTime

日期型

1998-01-01

分析重作日誌中時間戳≥StartTime的日誌檔案部分

EndTime

日期型

2988-01-01

分析重作日誌中時間戳≤EndTime的日誌檔案部分

DictFileName

字元型

字典檔案該檔案包含一個數據庫目錄的快照。

如下面的例子,我們僅僅分析2013年6月8日的日誌,:

EXECUTE dbms_logmnr.start_logmnr(

DictFileName => dictfilename=>'D:\..\practice\LOGMNR\dictionary.ora', 

StartTime =>to_date('2013-6-8 00:00:00','YYYY-MM-DD HH24:MI:SS')

EndTime =>to_date(''2013-6-8 23:59:59','YYYY-MM-DD HH24:MI:SS ')); 

也可以通過設定起始SCN和截至SCN來限制要分析日誌的範圍:

EXECUTE dbms_logmnr.start_logmnr(

DictFileName =>'D:\..\practice\LOGMNR\dictionary.ora',

StartScn =>20,

EndScn =>50); 

1.3.5 觀察分析結果(v$logmnr_contents)

到現在為止,我們已經分析得到了重作日誌檔案中的內容。動態效能檢視v$logmnr_contents包含LogMiner分析得到的所有的資訊。

SELECT sql_redo FROM v$logmnr_contents; 

如果我們僅僅想知道某個使用者對於某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到使用者LOGMINER對錶EMP所作的一切工作。

SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP'; 

序號

名稱

含義

1

SCN

特定資料變化的系統更改號

2

TIMESTAM

資料改變發生的