[Oracle]LogMiner工具小結

(一)LogMiner工具的做用
Logminer工具主要用來分析redo log和archive log文件。經過該工具,能夠輕鬆得到Oracle redo log和archive log文件的具體內容,甚至,能夠得到用戶對數據庫進行的DDL、DML操做。另外還可分析獲得一些須要回滾的sql語句。該工具特別適合調試、審計以及回退某個特定的對象。Logminer的做用總結以下:
1.跟蹤數據庫的變化,能夠離線跟蹤數據的變化,而不會影響在線的性能;
2.回退數據庫的變化,回退特定的變化的數據,減小point-in-time recovery的執行 ;
3.肯定事物級要執行的精細邏輯恢復操做,經過查詢log,取得須要的undo語句;
4.審計,查看具體用戶對數據庫作的具體操做。sql

注意:
1.LogMiner不支持IOT表、Long、LOB及集合類型;數據庫

 

(二)如何使用
(1)安裝LogMiner
一般在安裝數據庫後就已經安裝了Logminer,要查看數據庫是否安裝了LogMiner,只需查看數據庫中是否已經有了dbms_logmnr和dbms_logmnr_d這2個package,若是有了,則已經安裝,若是沒有,執行下面兩個腳本便可:session

$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE_HOME/rdbms/admin/dbmslmd.sql

須要注意,兩個腳本須用DBA用戶身份運行。第1個腳本用來建立dbms_logmnr包,該包用來分析日誌文件,第2個腳本用來建立dbms_logmnr_d包,該包用來建立數據字典文件。oracle

建立完成後數據庫中將多出4個procedure和3個view,具體以下:
1. dbms_logmnr_d.build :建立一個數據字典文件;
2. dbms_logmnr.add_logfile :添加日誌文件以供分析;
3. dbms_logmnr.start_logmnr :開始分析日誌文件;
4. dbms_logmnr.end_logmnr :結束分析日誌文件;app

1.v$logmnr_dictionary :顯示字典文件的信息;
2.logmnr_logs :在LogMiner啓動時顯示要分析的日誌列表;
3.logmnr_contents :Logminer啓動後,可使用該view查看日誌文件的內容。
須要注意,這裏的view是session相關,其它session是查看不到的,僅僅能夠在當前session中查看。工具

(2)若是要分析歸檔數據,須要數據庫需處於歸檔模式下,經過以下命令查看歸檔模式性能

SQL> archive log list;
數據庫日誌模式            存檔模式
自動存檔             啓用
存檔終點            /home/app/oracle/oradata/orcl/arch_log
最先的聯機日誌序列     46
下一個存檔日誌序列   49
當前日誌序列           49

(3)建立數據字典以前須要修改spfile參數utl_executefile_dir,因爲是靜態參數須要重啓數據庫測試

SQL> create directory utlfile as '/home/oracle/logmnr';
 
Directory created

SQL> alter system set utl_executefile_dir = '/home/oracle/logmnr' scope=spfile;

(4)生成數據字典文件(可選)
在使用LogMiner工具以前,可使用dbms_logmnr_d.build建立一個數據字典文件,建立該文件的目的是將數據字典導出爲一個文本文件,該文件是可選的,可是若是沒有該文件,LogMiner解釋出的關於數據字典中的部分,如表名、列名、元數據將會以16進制的形式展示,咱們是沒法理解的。
須要注意的是,若是咱們要分析的數據庫中的表發生了變化,影響到數據字典信息也發生了變化,那麼咱們在進行分析時,就須要從新生成數據字典文件。
建立數據字典文件須要以dba身份進行,建立到上面建好的logmnr文件中ui

begin
dbms_logmnr_d.build(dictionary_filename=>'dict.ora',
dictionary_location=>'/home/oracle/logmnr',
options=>dbms_logmnr_d.store_in_flat_file);
end;
/

(5)加入須要分析的日誌文件
LogMiner能夠對重作日誌文件(redo log)和歸檔日誌文件(archive log)進行分析,加入要分析的日誌文件使用dbms_logmnr.add_logfile過程,第一個文件使用參數dbms_logmnr.NEW參數,後面的文件使用dbms_logmnr.ADDFILE參數。
step1:建立列表,添加第1個文件:spa

BEGIN
  dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_49_936489730.dbf',options=>dbms_logmnr.NEW);
END;
/

step2:添加其它文件到列表

BEGIN
  dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_50_936489730.dbf',options=>dbms_logmnr.ADDFILE);
  dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE);
END;
/

(6)使用Logminer文件進行分析

LogMiner分析日誌文件能夠設置限制條件,也可不設置限制條件,不設置限制條件會對加載的所有日誌文件進行分析,設置了限制條件,只會對符合條件的日誌進行分析。

(6.1)不限制條件

EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora');

(6.2)有限制條件

經過對dbms_logmnr.start_logmnr中幾個不一樣參數的設置,能夠縮小要分析的日誌文件的範圍,經過設置起始時間和終止時間參數,咱們能夠限制只
分析某一個時間段內的日誌文件。
參數:

參數                 類型               默認值                解釋

--------------   -----------     --------------     ------------------------------------------------
StartScn          number         0                        分析日誌文件中scn > StartScn的日誌文件
EndScn            number         0                       分析日誌文件中scn < EndScn的日誌文件
StartTime         date             1998-01-01        分析日誌文件中時間戳 > StartTime的日誌文件
EndTime           date             2988-01-01        分析日誌文件中時間戳 < EndTime的日誌文件
DictFileName     varchar()                                數據字典文件的位置

(7)觀察分析結果
經過第(6)步,咱們已經獲得了重作日誌文件的內容,經過動態數據字典v$logmnr_contents能夠查看到全部的信息。

select * from v$logmnr_contents;

v$logmnr_contents的部分欄位信息:

欄位                                          解釋
---------------------------          ------------------------------------

SCN                                          查詢的特定數據的SCN號
TIMESTAM                                 數據改變發生的時間
COMMIT_TIMESTAMP                  數據改變提交的時間
SEG_OWNER                             數據發生改變的段名稱
SEG_NAME                                段的全部者的名稱
SEG_TYPE                                 數據發生改變的段類型
SEG_TYPE_NAME                       數據發生改變的段類型名稱
TABLE_SPACE                           變化段的表空間
ROW_ID                                   數據變化行的ID
SESSION_INFO                          數據發生變化時會話信息
OPERATION                               日誌中記錄的操做
SQL_REDO                               日誌中記錄的指定行變化的SQL語句(正向操做)
SQL_UNDO                               爲重作日誌記錄回退或恢復制定行變化的SQL語句

 

(三)一次LogMiner使用測試

(1)查看歸檔,下一個歸檔log是53

SQL> archive log list
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           /home/app/oracle/oradata/orcl/arch_log
Oldest online log sequence     50
Next log sequence to archive   53
Current log sequence           53

(2)查看數據字典存放位置

SQL> show parameter utl_file_dir

NAME            TYPE        VALUE
-------------   --------    -----------------------
utl_file_dir    string      /home/oracle/LOGMNR

(3)建立一張測試用的表

SQL> create table test06 
  2  (
  3  id number,
  4  name varchar(15)
  5  );
 
Table created
 
SQL> insert into test06 values(1,'lijiaman');
 
1 row inserted
 
SQL> insert into test06 values(2,'wangyujie');
 
1 row inserted

(4)將redo歸檔

SQL> alter system switch logfile;
 
System altered

(5)查看歸檔狀況

SQL> archive log list
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           /home/app/oracle/oradata/orcl/arch_log
Oldest online log sequence     50
Next log sequence to archive   53
Current log sequence           53
SQL> archive log list;
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           /home/app/oracle/oradata/orcl/arch_log
Oldest online log sequence     51
Next log sequence to archive   54
Current log sequence           54

(6)建立數據字典文件

begin
dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora',
dictionary_location=>'/home/oracle/LOGMNR',
options=>dbms_logmnr_d.store_in_flat_file);
end;
/

(7)添加要分析的歸檔日誌文件
(7.1)先到OS上找到歸檔文件:

[oracle@localhost LOGMNR]$ cd /home/app/oracle/oradata/orcl/arch_log
[oracle@localhost arch_log]$ ls
1_49_936489730.dbf  1_50_936489730.dbf  1_51_936489730.dbf  1_52_936489730.dbf  1_53_936489730.dbf

(7.2)建立歸檔日誌文件列表

SQL> begin
  2  dbms_logmnr.add_logfile(LogFileName => '/home/app/oracle/oradata/orcl/arch_log/1_53_936489730.dbf',Options => dbms_logmnr.new);
  3  end;
  4  /
 
PL/SQL procedure successfully completed

(7.3)若是不肯定待分析的數據是否在上面添加的歸檔日誌文件中,能夠多添加幾個

BEGIN
  dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE);
  dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_52_936489730.dbf',options=>dbms_logmnr.ADDFILE);
END;
/

PL/SQL procedure successfully completed

(8)開始分析

SQL> EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/LOGMNR/dictionary.ora');
 
PL/SQL procedure successfully completed

(9)查看結果

SQL> select c.timestamp,c.operation,c.table_space,c.sql_redo,c.sql_undo  from v$logmnr_contents c where c.seg_owner='LIJIAMAN';                                                                         
                                                                                                                                                                                                        
TIMESTAMP   OPERATION   TABLE_SPACE   SQL_REDO                                                                         SQL_UNDO                                                                         
----------- ----------- ------------- ----------------------------------------------------------------------   --------------------------------------------------------------------------------         
2017/4/25 2 DDL                                                                                                                                                                                         
                                      create table test06                                                                                                                                               
                                      (                                                                                                                                                                 
                                      id number,                                                                                                                                                        
                                      name varchar(15)                                                                                                                                                  
                                      )                                                                                                                                                                 
                                      ;                                                                                                                                                                 
                                                                                                                                                                                                        
2017/4/25 2 INSERT      USERS         insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('1','lijiaman');     delete from "LIJIAMAN"."TEST06" where "ID" = '1' and "NAME" = 'lijiaman' and ROW        
2017/4/25 2 INSERT      USERS         insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('2','wangyujie');    delete from "LIJIAMAN"."TEST06" where "ID" = '2' and "NAME" = 'wangyujie' and RO
相關文章
相關標籤/搜索