參考自:https://blog.csdn.net/yes_is_ok/article/details/79296614sql
原文轉自:http://blog.itpub.net/26736162/viewspace-2141148/數據庫
官方文檔地址:https://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL1559oracle
logminer使用注意:工具
LogMiner工具既能夠用來分析在線日誌,也能夠用來分析離線日誌文件,既能夠分析自己本身數據庫的重做日誌文件,也能夠用來分析其它數據庫的重做日誌文件。性能
當分析其它數據庫的重做日誌文件時,須要注意的是,LogMiner必須使用被分析數據庫實例產生的字典文件,而不是安裝LogMiner的數據庫產生的字典文件。ui
另外,必須保證安裝LogMiner數據庫的字符集和被分析數據庫的字符集相同。源數據庫(Source Database)平臺必須和分析數據庫(Mining Database)平臺同樣。spa
logminer的使用:操作系統
1、安裝logminer工具.net
在默認狀況下,Oracle已經安裝了LogMiner工具。如果沒有安裝,則能夠運行下面兩個腳本:日誌
$ORACLE_HOME/rdbms/admin/dbmslm.sql $ORACLE_HOME/rdbms/admin/dbmslmd.sql
這兩個腳本必須均以SYS用戶身份運行。
其中第一個腳本用來建立DBMS_LOGMNR包,該包用來分析日誌文件。
第二個腳本用來建立DBMS_LOGMNR_D包,該包用來建立數據字典文件。
若要使普通用戶具備日誌挖掘的權限,則能夠執行以下的SQL進行賦權:
GRANT EXECUTE ON DBMS_LOGMNR TO LOGMINER_TEST;
腳本執行完畢後,LogMiner包含兩個PL/SQL包和幾個視圖:
一、DBMS_LOGMNR_D包,包括一個用於提取數據字典信息的過程,即DBMS_LOGMNR_D.BUILD()過程,還包含一個重建LogMiner表的過程,DBMS_LOGMNR_D.SET_TABLESPACE。在默認狀況下,LogMiner的表是建在SYSTEM表空間下的。
二、DBMS_LOGMNR包,它有3個存儲過程:
ADD_LOGFILE(NAME VARCHAR2,OPTIONS NUMBER) 用來添加或刪除用於分析的日誌文件 START_LOGMNR(START_SCN NUMBER,END_SCN NUMBER,START_TIME NUMBER,END_TIME NUMBER,DICTFILENAME VARCHAR2,OPTIONS NUMBER) 用來開啓日誌分析,同時肯定分析的時間或SCN窗口以及確認是否使用提取出來的數據字典信息 END_LOGMNR()存儲過程用來終止分析會話,它將回收LogMiner所佔用的內存
與LogMiner相關的數據字典視圖:
V$LOGHIST:顯示歷史日誌文件的一些信息
V$LOGMNR_DICTIONARY:由於LOGMINER能夠有多個字典文件,因此該視圖顯示字典文件信息
V$LOGMNR_PARAMETERS:顯示LOGMINER的參數
V$LOGMNR_LOGS:顯示用於分析的日誌列表信息
V$LOGMNR_CONTENTS:LOGMINER結果
2、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的操做包含以下步驟:
一、進行初始化設置:開啓附加日誌,設置LogMiner的表空間,設置UTL_FILE_DIR參數的值;
二、提取一個字典:將字典文件提取爲Flat File或Redo日誌,或者直接使用Online Catalog;
三、指定須要分析的Redo日誌文件:利用DBMS_LOGMNR.ADD_LOGFILE來添加日誌;
四、開始LogMiner:執行DBMS_LOGMNR.START_LOGMNR來啓動LogMiner;
五、查詢V$LOGMNR_CONTENTS視圖;
六、結束LogMiner:經過執行EXECUTE DBMS_LOGMNR.END_LOGMNR來結束分析。
在使用LogMiner以前須要確認Oracle是否帶有進行LogMiner分析包,通常來講Windows操做系統Oracle10g以上都默認包含。若是不能確認,能夠DBA身份登陸系統,查看系統中是否存在運行LogMiner所須要的dbms_logmnr、dbms_logmnr_d包,若是沒有須要安裝LogMiner工具,必須首先要運行下面這樣兩個腳本:
一、$ORACLE_HOME/rdbms/admin/dbmslm.sql
二、$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工具其實是由兩個新的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文件夾:
CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR';
alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;
建立字典文件須要以DBA用戶登陸,建立到上面配置好的LogMiner文件夾中:
CONN LOGMINER/ LOGMINER@PRACTICE AS SYSDBA
XECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
Oracle的LogMiner能夠分析在線(online)和歸檔(offline)兩種日誌文件,加入分析日誌文件使用dbms_logmnr.add_logfile過程,第一個文件使用dbms_logmnr.NEW參數,後面文件使用dbms_logmnr.ADDFILE參數。
一、建立列表
BEGIN dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW);
END; /
二、添加其餘日誌文件到列表
BEGIN dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE);
dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00003_0817639922.001',options=>dbms_logmnr.ADDFILE);
END;
/
Oracle的LogMiner分析時分爲無限制條件和限制條件兩種,無限制條件中分析全部加入到分析列表日誌文件,限制條件根據限制條件分析指定範圍日誌文件。
一、無限制條件
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
二、有限制條件
經過對過程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);
到如今爲止,咱們已經分析獲得了重做日誌文件中的內容。動態性能視圖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 |
數據改變發生的時間 |
3 |
COMMIT_TIMESTAMP |
數據改變提交的時間 |
4 |
SEG_OWNER |
數據發生改變的段名稱 |
5 |
SEG_NAME |
段的全部者名稱 |
6 |
SEG_TYPE |
數據發生改變的段類型 |
7 |
SEG_TYPE_NAME |
數據發生改變的段類型名稱 |
8 |
TABLE_SPACE |
變化段的表空間 |
9 |
ROW_ID |
特定數據變化行的ID |
10 |
SESSION_INFO |
數據發生變化時用戶進程信息 |
11 |
OPERATION |
重作記錄中記錄的操做(如INSERT) |
12 |
SQL_REDO |
能夠爲重作記錄重作指定行變化的SQL語句(正向操做) |
13 |
SQL_UNDO |
能夠爲重作記錄回退或恢復指定行變化的SQL語句(反向操做) |
須要強調一點的是,視圖v$logmnr_contents中的分析結果僅在咱們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是由於全部的LogMiner存儲都在PGA內存中,全部其餘的進程是看不到它的,同時隨着進程的結束,分析結果也隨之消失。
最後,使用過程DBMS_LOGMNR.END_LOGMNR終止日誌分析事務,此時PGA內存區域被清除,分析結果也隨之再也不存在。