Log Miner 挖挖挖

沃趣科技發表於2018-10-23

| Log Miner簡介

Log Miner是Oracle自Oracle 8i以後推出的一個可以分析資料庫redo log和archivelog內容的工具,可以透過日誌分析所有對資料庫的DDL和DML操作,也可以分析出操作的時間與操作時的SCN和進行操作的機器,對於DML操作還可以查詢出還原操作的sql。


| Log Miner組成

  • 源資料庫 產生LogMiner分析的所有重做日誌檔案的資料庫

  • 挖掘資料庫 是執行LogMiner分析時使用的資料庫。

  • LogMiner資料字典 是LogMiner使用字典將內部物件識別符號和資料型別轉換為可讀資料。如果沒有字典,Log Miner分析的結果會顯示為二進位制資料。


| Log Miner資料字典選項

當LogMiner分析重做資料時,需要一個資料字典將日誌的物件ID轉換為可讀資料。LogMiner提供了三個使用資料字典的方式。

1、使用線上目錄( Online Catalog) 

使用catalog的資料字典,必須在源資料庫執行。啟動命令為:


SQL> execute dbms_logmnr.start_logmnr (


options

=>

dbms_logmnr.dict_from_online_catalog);


2、將LogMiner字典提取到archive log。啟動命令為:


SQL> execute dbms_logmnr_d.build(


options

=>

dbms_logmnr_d.store_in_redo_logs);

使用這種操作的


3、將LogMiner字典提取到作業系統檔案。啟動命令為:



SQL>


 execute dbms_logmnr_d.build (

'directory_name'

'/xxx/xxx/'

,dbms_logmnr_d.store_in_flat_file);


使用這種方式的話,需要設定utl_file_dir引數,該引數需要重啟才能生效。


這個工具使用起來並不複雜。由於將Log Miner資料字典提取到作業系統檔案在未設定引數的情況下需要重啟資料庫,使用場景比較狹隘,所以以下測試場景為使用Online catalog資料字典模式和將字典提取到redo log。


| 測試場景

1、確認資料庫開啟了補充日誌


sys@RAC11G>

select

 SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME
--------
YES
--如果返回結果為 no ,透過以下命令開啟
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;


注意: 在使用Log Miner分析的日誌檔案之前,必須啟用補充日誌。 
啟用補充日誌時,會在重做日誌流中記錄其他資訊。如果不開啟,LogMiner的挖掘的一些資訊無法正常顯示。

2、建立測試表,並做一些DML與DDL操作



sys

@

RAC11G

> create table test1 (NAME varchar2(

20

), ID number);

Table   created .
sys @ RAC11G > insert  into test1 values( 'x' , '1' );
row   created .
sys @ RAC11G > insert  into test1 values( 'xx' , '2' );
row   created .
sys @ RAC11G > insert  into test1 values( 'xxx' , '3' );
row   created .
sys @ RAC11G > commit ;
Commit   complete .
sys @ RAC11G > update  test1 set name =  'xxxx'  where id = 3 ;
row   updated .
sys @ RAC11G > commit ;
Commit   complete .
sys @ RAC11G > truncate  table test1;
Table   truncated .


3、切換歸檔日誌


sys@RAC11G>alter system 

switch

 logfile;

System altered.
sys@RAC11G>alter system  switch  logfile;
System altered.
--然後檢視最後生成的歸檔日誌
sys@RAC11G>select *  from  (select name   from  v$archived_log where name like  '%archive%'   order  by  SEQUENCE # desc ) where rownum <3;
NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/ 2018 _10_14/thread_1_seq_293 .847.989533723
+DATADG/rac11g/archivelog/ 2018 _10_14/thread_1_seq_292 .846.989533631


4、Log Miner新增需要分析的歸檔日誌


--新增日誌

sys@RAC11G> execute dbms_logmnr.add_logfile(logfilename=> '+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_293.847.989533723' ,options=>dbms_logmnr.new);
PL/SQL  procedure   successfully   completed .
--新增多個日誌,使用 DBMS_LOGMNR . ADDFILE 選項
sys @ RAC11G > execute   dbms_logmnr . add_logfile (logfilename=> '+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_292.846.989533631' ,options=>DBMS_LOGMNR.ADDFILE) ;

PL/SQL  procedure   successfully   completed .


5、啟動Log Miner


sys@RAC11G>execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

PL/SQL  procedure   successfully   completed .


6、透過檢視v$logmnr_contents進行分析結果查詢

v$logmnr_contents只有在開啟了Log Miner後才可以進行查詢



select

 to_char(

timestamp

,

'yyyy-mm-dd hh24:mm:ss'

),

operation,
username,
SESSION_INFO,
sql_redo 
from  v$logmnr_contents
where  table_name =  'TEST1' ;
TO_CHAR(TIMESTAMP,' OPERATION                USERNAME        SESSION_INFO                                SQL_REDO
------------------- -------------------------------- --------------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
2018-10-14 22:10:50 DDL                  SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS   create   table  test1 ( NAME  varchar2( 20 ),  ID   number );
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:29  INSERT                 SYS          login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS  insert   into   "SYS" . "TEST1" ( "NAME" , "ID" values  ( 'x' , '1' );
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:33  INSERT                 SYS          login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS  insert   into   "SYS" . "TEST1" ( "NAME" , "ID" values  ( 'xx' , '2' );
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:37  INSERT                 SYS          login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS  insert   into   "SYS" . "TEST1" ( "NAME" , "ID" values  ( 'xxx' , '3' );
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:51  UPDATE                 SYS          login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS  update   "SYS" . "TEST1"   set   "NAME"  =  'xxxx'   where   "NAME"  =  'xxx'   and   ROWID  =  '
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V AAAE6eAABAAAKHBAAC'
;
                                 1-V3)
2018-10-14 22:10:12 DDL                  SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS  truncate   table  test1;
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
.


7、關閉Log Miner



EXECUTE

 DBMS_LOGMNR.END_LOGMNR();


注意: Log Miner的資料只存在PGA中,如果查詢的會話斷開連線,Log Miner也會隨之關閉。

8、將資料字典提取到redo log


sys@RAC11G>EXECUTE DBMS_LOGMNR_D.BUILD (OPTIONS => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

PL/SQL  procedure   successfully   completed .
根據字典的大小,它可能包含在多個歸檔檔案中。如果已歸檔相關的重做日誌檔案,則可以找出包含提取的字典的開頭和結尾的歸檔日誌。可以查詢 V $ ARCHIVED_LOG 檢視
sys @ RAC11G > SELECT   NAME   FROM   V $ ARCHIVED_LOG   WHERE   DICTIONARY_BEGIN =' YES ';

NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/ 2018 _10_15/thread_1_seq_308. 869.989570647
sys@RAC11G>SELECT  NAME  FROM V$ARCHIVED_LOG WHERE DICTIONARY_END= 'YES' ;
NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/ 2018 _10_15/thread_1_seq_309. 871.989570649


9、新增包含資料字典的歸檔日誌以及需要分析的歸檔日誌


sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>

'+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_308.869.989570647'

,options=>dbms_logmnr.new);

PL/SQL  procedure   successfully   completed .
sys @ RAC11G > execute   dbms_logmnr . add_logfile (logfilename=> '+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_309.871.989570649' ,options=>dbms_logmnr.addfile) ;

PL/SQL  procedure   successfully   completed .
sys @ RAC11G > execute   dbms_logmnr . add_logfile (logfilename=> '+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_293.847.989533723' ,options=>dbms_logmnr.addfile) ;

PL/SQL  procedure   successfully   completed .
sys @ RAC11G > execute   dbms_logmnr . add_logfile (logfilename=> '+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_292.846.989533631' ,options=>dbms_logmnr.addfile) ;

PL/SQL  procedure   successfully   completed .


10、啟動Log Miner


sys@RAC11G> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.DICT_FROM_REDO_LOGS);

PL/SQL  procedure   successfully   completed .


11、透過檢視v$logmnr_contents進行分析結果查詢



select

 to_char(

timestamp

,

'yyyy-mm-dd hh24:mm:ss'

),

operation,
username,
SESSION_INFO,
sql_redo 
from  v$logmnr_contents
7      where  table_name =  'TEST1' ;
TO_CHAR(TIMESTAMP,' OPERATION                USERNAME
------------------- -------------------------------- ------------------------------
SESSION_INFO
---------------------------------------------------------------------------------------------------------------------------------------
SQL_REDO
---------------------------------------------------------------------------------------------------------------------------------------
2018-10-14 22:10:50 DDL                  SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
create   table  test1 ( NAME  varchar2( 20 ),  ID   number );
2018-10-14 22:10:29  INSERT                 SYS
login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS_terminal=pts/ 5  OS_process_id= 17273  OS_program_name=sqlplus@
11 gnode1 (TNS V1-V3)
insert   into   "SYS" . "TEST1" ( "COL 1" , "COL 2" values  (HEXTORAW( '78' ),HEXTORAW( 'c102' ));
2018-10-14 22:10:33  INSERT                 SYS
login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS_terminal=pts/ 5  OS_process_id= 17273  OS_program_name=sqlplus@
11 gnode1 (TNS V1-V3)
insert   into   "SYS" . "TEST1" ( "COL 1" , "COL 2" values  (HEXTORAW( '7878' ),HEXTORAW( 'c103' ));
2018-10-14 22:10:37  INSERT                 SYS
login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS_terminal=pts/ 5  OS_process_id= 17273  OS_program_name=sqlplus@
11 gnode1 (TNS V1-V3)
insert   into   "SYS" . "TEST1" ( "COL 1" , "COL 2" values  (HEXTORAW( '787878' ),HEXTORAW( 'c104' ));
2018-10-14 22:10:51  UPDATE                 SYS
login_username= SYS  client_info= OS_username= oracle  Machine_name= 11 gnode1 OS_terminal=pts/ 5  OS_process_id= 17273  OS_program_name=sqlplus@
11 gnode1 (TNS V1-V3)
update   "SYS" . "TEST1"   set   "COL 1"  = HEXTORAW( '78787878' where   "COL 1"  = HEXTORAW( '787878' and   ROWID  =  'AAAE6eAABAAAKHBAAC' ;
2018-10-14 22:10:12 DDL                  SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
truncate   table  test1;


| Log Miner的一些限制

當然,這個工具也有一定的限制

  • 源資料庫與挖掘資料庫

    • 源資料庫和挖掘資料庫都必須在同一作業系統平臺上執行。

    • 挖掘資料庫可以與源資料庫相同或完全獨立。

    • 挖掘資料庫必須執行與源資料庫相同的版本或更高版本的Oracle資料庫軟體。

    • 挖掘資料庫必須使用源資料庫使用的相同字符集(或字符集的超集)。

  • Log Miner 資料字典

    • 資料字典必須由源資料庫生成。

  • 歸檔日誌

    • 每次分析的所有歸檔日誌必須由相同的源資料生成。

    • 必須與同一資料庫關聯RESETLOGS SCN。

    • 必須來自8i或更高版本的Oracle資料庫。

這些限制都不算苛刻,如果靈活使用這個工具的話,可以使歸檔日誌利用最大化,在關鍵時間有非常大的作用。


|  作者簡介

陳康,沃趣科技資料庫技術專家

主要參與公司產品實施、測試、維護以及最佳化。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2217182/,如需轉載,請註明出處,否則將追究法律責任。

相關文章