衆所周知,全部對用戶數據和數據字典的改變都記錄在Oracle的Redo Log中,所以,Redo Log包含了全部進行恢復操做所須要的信息。可是,原始的Redo Log文件沒法看懂,因此,Oracle從8i之後提供了一個很是有用的分析工具,稱爲LogMiner。使用該工具能夠輕鬆得到Redo Log文件(包含歸檔日誌文件)中的具體內容。特別是該工具能夠分析出全部對於數據庫的DML操做(INSERT、UPDATE、DELETE等)語句。Oracle 9i後能夠分析DDL語句,另外還可分析獲得一些必要的回滾SQL語句。LogMiner一個最重要的用途就是不用所有恢復數據庫就能夠恢復數據庫的某個變化。該工具特別適用於調試、審計或者回退某個特定的事務。sql
LogMiner工具既能夠用來分析在線日誌,也能夠用來分析離線日誌文件,既能夠分析自己本身數據庫的重做日誌文件,也能夠用來分析其它數據庫的重做日誌文件。當分析其它數據庫的重做日誌文件時,須要注意的是,LogMiner必須使用被分析數據庫實例產生的字典文件,而不是安裝LogMiner的數據庫產生的字典文件,另外,必須保證安裝LogMiner數據庫的字符集和被分析數據庫的字符集相同。源數據庫(Source Database)平臺必須和分析數據庫(Mining Database)平臺同樣。數據庫
Oracle經過LogMiner工具對Redo Log進行挖掘,顯示出一系列可讀的信息,該過程稱爲日誌挖掘。LogMiner經過V$LOGMNR_CONTENTS視圖顯示Redo Log中的信息。服務器
總的說來,LogMiner工具的主要用途有:session
一、跟蹤數據庫的變化:能夠離線地跟蹤數據庫的變化,而不會影響在線系統的性能oracle
二、回退數據庫的變化:回退特定的變化數據,減小Point-In-Time Recovery的執行ide
三、優化和擴容計劃:可經過分析日誌文件中的數據以分析數據的增加模式工具
四、肯定數據庫的邏輯損壞時間:準肯定位操做執行的時間和SCN性能
五、肯定事務級要執行的精細邏輯恢復操做,能夠取得相應的UNDO操做測試
六、執行後續審計優化
(一)安裝LogMiner工具
在默認狀況下,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 LHR_TEST;
腳本執行完畢後,LogMiner包含兩個PL/SQL包和幾個視圖:
一、DBMS_LOGMNR_D包,包括一個用於提取數據字典信息的過程,即DBMS_LOGMNR_D.BUILD()過程,還包含一個重建LogMiner表的過程,DBMS_LOGMNR_D.SET_TABLESPACE。在默認狀況下,LogMiner的表是建在SYSTEM表空間下的。
二、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的操做包含以下步驟:
一、進行初始化設置:開啓附加日誌,設置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來結束分析。
下面給出一個使用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';
Oracle LogMiner 是Oracle公司從產品8i之後提供的一個實際很是有用的分析工具,使用該工具能夠輕鬆得到Oracle 在線/歸檔日誌文件中的具體內容,特別是該工具能夠分析出全部對於數據庫操做的DML和DDL語句。該工具特別適用於調試、審計或者回退某個特定的事務。
LogMiner分析工具其實是由一組PL/SQL包和一些動態視圖(Oracle8i內置包的一部分)組成,它做爲Oracle數據庫的一部分來發布是8i產品提供的一個徹底免費的工具。但該工具和其餘Oracle內建工具相比使用起來顯得有些複雜,主要緣由是該工具沒有提供任何的圖形用戶界面(GUI)。
在Oracle 8i以前,Oracle沒有提供任何協助數據庫管理員來讀取和解釋重做日誌文件內容的工具。系統出現問題,對於一個普通的數據管理員來說,惟一能夠做的工做就是將全部的log文件打包,而後發給Oracle公司的技術支持,而後靜靜地等待Oracle 公司技術支持給咱們最後的答案。然而從8i之後,Oracle提供了這樣一個強有力的工具--LogMiner。
LogMiner 工具便可以用來分析在線,也能夠用來分析離線日誌文件,便可以分析自己本身數據庫的重做日誌文件,也能夠用來分析其餘數據庫的重做日誌文件。
總的說來,LogMiner工具的主要用途有:
一、跟蹤數據庫的變化:能夠離線的跟蹤數據庫的變化,而不會影響在線系統的性能。
二、回退數據庫的變化:回退特定的變化數據,減小point-in-time recovery的執行。
三、優化和擴容計劃:可經過分析日誌文件中的數據以分析數據增加模式
在使用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啓動後,可使用該視圖在SQL提示符下輸入SQL語句來查詢重作日誌的內容 |
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');
Oracle的LogMiner能夠分析在線(online)和歸檔(offline)兩種日誌文件,加入分析日誌文件使用dbms_logmnr.add_logfile過程,第一個文件使用dbms_logmnr.NEW參數,後面文件使用dbms_logmnr.ADDFILE參數。
一、建立列表
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW); 3 END; 4 /
二、添加其餘日誌文件到列表
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 /
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內存區域被清除,分析結果也隨之再也不存在。
Oracle數據使用LogMiner查看執行SQL語句,其中須要進行以下四步驟是指:
一、設置數據庫爲歸檔模式;
二、設置LogMiner字典文件路徑等;
三、建立數據同步用戶(如用戶名爲LOGMINER,該用戶擁有DBA權限);
四、驗證配置是否成功;
使用SqlPlus或者命令行界面鏈接數據庫(如下以命令行界面操做)
--進入SqlPlus程序
sqlplus /nolog
--使用DBA用戶登陸到源數據庫中
conn system/system@practic as sysdba
--查看PRACTICE數據庫是否處於歸檔模式
1 SELECT dbid, name, log_mode FROM v$database; 2 或者 3 ARCHIVE LOG LIST;
若是顯示數據庫顯示爲歸檔模式,則設置數據庫爲歸檔模式可跳過;若是顯示數據庫爲非歸檔模式則須要進行如下設置。
上圖顯示數據庫未進行歸檔,須要進行歸檔設置。
建立ARCHIVE文件夾,ARCHIVE文件夾路徑根據所在服務器進行設置,在下面操做中設置爲" D:\oracle\oradata\practice\ARCHIVE"
--設置歸檔日誌文件路徑
ALTER SYSTEM SET log_archive_dest="D:\oracle\oradata\practice\ARCHIVE";
--日誌文件名稱格式:
ALTER SYSTEM SET log_archive_format="ARC%S_%R.%T" SCOPE=SPFILE;
--修改完畢後,關閉數據庫,以MOUNT方式啓動
1 SHUTDOWN IMMEDIATE; 2 STARTUP MOUNT;
--設置數據庫爲歸檔模式
ALTER DATABASE ARCHIVELOG;
(注意:若是重啓數據失敗,請參考第4章節異常問題處理)
--查看PRACTICE數據庫是否處於歸檔模式
1 SELECT dbid, name, log_mode FROM v$database; 2 或者 3 ARCHIVE LOG LIST;
--驗證參數設置是否起做用
SELECT dest_id, status, destination FROM v$archive_dest WHERE dest_id =1;
--在參數文件設置已經起做用,打開數據庫
ALTER DATABASE OPEN;
建立LOGMNR文件夾,路徑爲"D:\oracle\oradata\practice\LOGMNR"
--建立數據字典文件
1 CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR'; 2 alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;
--建立數據字典文件
alter database add supplemental log data;
--修改完畢後,關閉數據庫,以MOUNT方式啓動
1 SHUTDOWN IMMEDIATE; 2 STARTUP;
--查看Logminer文件夾是否設置
SHOW PARAMETER utl_file_dir;
在數據庫建立LOGMINER用戶,該用戶須要具備DBA權限
--在源數據庫建立LOGMINER用戶,並賦予DBA權限
1 CREATE USER LOGMINER IDENTIFIED BY LOGMINER; 2 GRANT CONNECT, RESOURCE,DBA TO LOGMINER;
在使用LogMiner讀取歸檔/在線日誌須要按照第2章節進行設置,設置完畢後能夠對歸檔和在線日誌進行分析。特別是須要開啓LogMiner日誌補充模式,若是沒有開始LogMiner補充模式將沒法查看DDL語句,按照測試結果看,只有開始LogMiner日誌補充模式後,才能查看DDL語句,在此以前進行DDL將沒法進行查看。
--以LOGMINER用戶登陸(非DBA登陸)建立AAAAA表(Oracle11g請注意用戶名、密碼大小寫)
1 CONNECT LOGMINER/LOGMINER@PRACTICE 2 CREATE TABLE AAAAA(field001 varchar2(100)); 3 INSERT INTO AAAAA (field001) values ('000000'); 4 INSERT INTO AAAAA (field001) values ('0000010'); 5 commit;
數據庫對象發生變化,須要從新建立數據字典文件
--以LOGMINER用戶(DBA權限)登陸,生成字典文件
1 CONN LOGMINER/LOGMINER@PRACTICE AS SYSDBA 2 EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
--須要確認當前處於聯機狀態的日誌文件
SELECT group#, sequence#, status, first_change#, first_time FROM V$log ORDER BY first_change#;
從上圖能夠看出在線日誌REDO03處於ACTIVE狀態中
--加入解析在線日誌文件
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW); 3 END; 4 /
--啓動LogMiner進行分析
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
--查詢相關操做日誌
1 SELECT sql_redo, sql_undo, seg_owner 2 FROM v$logmnr_contents 3 WHERE seg_name='AAAAA' 4 AND seg_owner='LOGMINER';
--以LOGMINER用戶登陸(非DBA權限)建立EMP表(Oracle11g請注意用戶名、密碼大小寫)
1 CONN LOGMINER/ LOGMINER@PRACTICE 2 CREATE TABLE EMP 3 (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, 4 ENAME VARCHAR2(10), 5 JOB VARCHAR2(9), 6 MGR NUMBER(4), 7 HIREDATE DATE, 8 SAL NUMBER(7,2), 9 COMM NUMBER(7,2), 10 DEPTNO NUMBER(2));
--插入EMP數據
1 INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20); 2 INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30); 3 INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30); 4 INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20); 5 COMMIT;
--從v$log視圖中找出日誌文件的序號
1 CONNECT system/system@practice as sysdba 2 ALTER SYSTEM SWITCH LOGFILE; 3 select sequence#, FIRST_CHANGE#, NEXT_CHANGE#,name from v$archived_log order by sequence# desc;
確保按照2.2進行logMiner設置
--以LOGMINER用戶(DBA權限)登陸,生成字典文件
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 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.NEW); 3 END; 4 /
--啓動LogMiner進行分析
1 EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
--查詢相關操做日誌
1 SELECT sql_redo, sql_undo 2 FROM v$logmnr_contents 3 WHERE seg_name='EMP' 4 AND seg_owner='LOGMINER';
若是出現ORA-12514錯誤時,以下圖所示:
須要修改listerner.ora文件,具體在Oracle安裝目錄\NETWORK\ADMIN下,當前操做爲" D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora "加入以下設置
1 (SID_DESC = 2 (GLOBAL_DBNAME = practice) 3 (ORACLE_HOME = D:\oracle\product\10.2.0\db_1) 4 (SID_NAME = practice) 5 )
設置後須要從新啓動TNSListener,便可生效
若是出現ORA-16018錯誤時,以下圖所示:
該問題是數據庫開啓了閃回功能,歸檔文件默認狀況下是保存到閃迴路徑中,簡單的處理方式是在設置歸檔路徑中加入scope=spfile參數
--設置歸檔日誌文件路徑
ALTER SYSTEM SET log_archive_dest="D:\oracle\oradata\practice\ARCHIVE" scope=spfile;
此時查看閃迴路徑,該路徑並未影響,只不過閃迴文件和歸檔文件保存到各自文件夾中
參見Oracle官方站點對LogMiner介紹,地址以下:
http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm