logminer工具的學習

OmarChina發表於2007-10-18

logminer工具的學習

[@more@]

A:基本物件:
source database:包含了要分析的重做日誌和歸檔日誌
mining database:執行logminer操作要使用的資料庫
logminer 字典: 將內部物件ID號和資料型別轉換成為物件名和外部資料格式,若不用字典進行分析。產生的LOG不是很容易讀。(如例)
B:logminer配置需求:
1,source和mining database必須執行在相同的硬體平臺
2,mining database可以和source database在一臺資料庫上,也可以獨立。
3,mining database版本必須高於source database
4,source和mining database必須字符集相同
5,logminer字典必須在source database生成
6,若多個日誌的話,必須是來源於同一個source database
7,若多個日誌的話,必須是具有相同的resetlogs scn
8,被分析的redo和arch必須在oracle8.0版本以上
C:補充日誌:supplemental log
redo和arch使用者實現恢復,這些資料自動記錄在日誌中,除了這些還要記錄其他一部分的資訊,記錄其他列的日誌過程被稱為補充日誌。
預設情況,資料庫不提供補充日誌,所以預設下logminer不支援:
1,索引族,鏈行和遷移行。
2,直接路徑插入
3,摘取logminer字典到redo log
4,跟蹤ddl
5,生成健列的sql_redo和sql_undo
6,long和lob資料型別
如果要使用這些特性的話,必須開啟這個功能。如下過程
C:Documents and SettingsAdministrator>sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 9月 10 20:51:14 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
連線到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
> alter database add supplemental log data;
資料庫已更改。

D:Logminer不支援的資料型別和表儲存屬性:
bfile
抽象資料型別
集合型別(巢狀表和varray)
參照物件
xmltype
具有Lob列的索引組織表
使用compress特性的表
E:使用logminer字典時候,有三種選項:
1,使用source database 資料字典(online catalog)
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
這樣的方式要求資料庫必須OPEN狀態,且只能trace DML,無法跟蹤DDL操作.
2,使用logminer字典到從做日誌。
execute dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
這樣的方式要求資料庫還必須要在archive的模式下。若在分析資料庫日誌的時候,要分析的表
結構發生了改變。ORACLE推薦使用這個選項分析日誌。
3,摘取logmnr字典到字典檔案中.
建立字典檔案的方法如下:
> alter system set utl_file_dir='D:oraclelogmnr' scope=spfile;
----設定utl_file_dir目錄
系統已更改。
這是為了相容以前的版本
> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
> startup
ORACLE 例程已經啟動。

Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 62915940 bytes
Database Buffers 100663296 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
資料庫已經開啟。
> execute dbms_logmnr_d.build('dict.ora','d:oraclelogmnr',dbms_logmnr_d.store_in
_flat_file);
---第一個參數列示字典檔名
---第二個參數列示字典檔案目錄,和utl_file_dir目錄一致
---第三個參數列示要使用字典檔案
PL/SQL 過程已成功完成。

F:分析DML操作
下面演示:
> conn u_omar/biohazard
已連線。
> create table emp as select * from scott.emp where 1=0;
表已建立。
> insert into emp select * from scott.emp;
已建立14行。
> commit;
提交完成。
> select a.group#,a.status,b.member from v$log a,v$logfile b
2 where a.group#=b.group#;

GROUP# STATUS MEMBER
---------- ---------------- --------------------------------------------------
3 UNUSED D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG
1 CURRENT D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG
> conn / as sysdba
已連線。
第一步,建立分析列表:
> execute dbms_logmnr.add_logfile(logfilename=>'D:ORACLEPRODUCT10.2.0ORADATAO
RCLREDO01.LOG',options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。
------new指定一個新的日誌

> execute dbms_logmnr.add_logfile(logfilename=>'D:ORACLEPRODUCT10.2.0ORADATAO
RCLREDO03.LOG',options=>dbms_logmnr.addfile);
-----若有多個日誌要分析的話,就要addfile
-----若要移除日誌的話就要DBMS_LOGMNR.REMOVEFILE
第二步,啟動logmnr
> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL 過程已成功完成。
-----這是使用online catalog的方式分析日誌
-----啟動分析的時候,可以限制時間範圍,也可以指定起始SCN和結束SCN
第三步,檢視分析的結果
-----只能在當前會話中檢視,其他會話不可以檢視到結果集
> select username,timestamp,sql_redo from v$logmnr_contents
2 where seg_name='EMP' and rownum<=2;

USERNAME TIMESTAMP SQL_REDO
-------- -------------- ------------------------------------------------------------
U_OMAR 10-9月 -07 create table emp as select * from scott.emp where 1=0;
U_OMAR 10-9月 -07 insert into "U_OMAR"."EMP"("EMPNO","ENAME","JOB","MGR","HIRE
DATE","SAL","COMM","DEPTNO") values ('7369','SMITH','CLERK',
'7902',TO_DATE('17-12月-80', 'DD-MON-RR'),'800',NULL,'20');
-----結束Logmnr
> execute dbms_logmnr.end_logmnr;

PL/SQL 過程已成功完成。
---------不用logmnr字典的方式來進行logmnr
> execute dbms_logmnr.start_logmnr();
PL/SQL 過程已成功完成。
> execute dbms_logmnr.add_logfile(logfilename=>'D:ORACLEPRODUCT10.2.0ORADATAO
RCLREDO01.LOG',options=>dbms_logmnr.new);
PL/SQL 過程已成功完成。
----------不用任何字典的方式
> execute dbms_logmnr.start_logmnr();
> select username,timestamp,sql_redo from v$logmnr_contents
2 where username='U_OMAR' AND UPPER(SQL_REDO) LIKE 'INSERT%' AND ROWNUM<=2;

USERNAME TIMESTAMP SQL_REDO
-------- -------------- ------------------------------------------------------------
U_OMAR 10-9月 -07 insert into "UNKNOWN"."OBJ# 18"("COL 1","COL 2","COL 3","COL
4","COL 5","COL 6","COL 7","COL 8","COL 9","COL 10","COL 11
","COL 12","COL 13","COL 14","COL 15","COL 16","COL 17") val
ues (HEXTORAW('c306471b'),HEXTORAW('c306471b'),HEXTORAW('c13
e'),HEXTORAW('454d50'),HEXTORAW('c102'),NULL,HEXTORAW('c103'
),HEXTORAW('786b090a161b09'),HEXTORAW('786b090a161b09'),HEXT
ORAW('786b090a161b09'),HEXTORAW('c102'),NULL,NULL,HEXTORAW('
80'),NULL,HEXTORAW('c107'),HEXTORAW('c102'));

U_OMAR 10-9月 -07 insert into "UNKNOWN"."OBJ# 14"("COL 1","COL 2","COL 3","COL
4","COL 5","COL 6","COL 7","COL 8","COL 9","COL 10","COL 11
","COL 12","COL 13","COL 14","COL 15","COL 16","COL 17","COL
18","COL 19") values (HEXTORAW('c10c'),HEXTORAW('c107'),HEX
TORAW('c3020334'),HEXTORAW('c104'),HEXTORAW('c109'),HEXTORAW
('c102'),HEXTORAW('c109'),HEXTORAW('c102'),HEXTORAW('c516303
1252e'),HEXTORAW('c2021d'),HEXTORAW('80'),HEXTORAW('c13e'),H
EXTORAW('80'),HEXTORAW('80'),HEXTORAW('80'),HEXTORAW('80'),H
EXTORAW('80'),HEXTORAW('c306471b'),HEXTORAW('c30e0e1e'));
----------------查詢出來的資訊,都是沒有經過轉換的ID
G:使用Logmnr分析DDL操作:
要分析DDL,必須使用字典檔案存放在日誌中。即要把DB放在ARCHIVE上

> conn u_omar/biohazard
已連線。
> drop table emp;

表已刪除。
以下為分析步驟:
> execute dbms_logmnr.add_logfile(logfilename=>'D:ORACLEPRODUCT10.2.0ORADATAO
RCLREDO01.LOG',options=>dbms_logmnr.new);

PL/SQL 過程已成功完成。

> execute dbms_logmnr.start_logmnr(dictfilename=>'D:oraclelogmnrdict.ora',optio
ns=>dbms_logmnr.ddl_dict_tracking);
-------------------dictfilename使用的是字典檔案
-------------------ddl_dict_tracking是隻申請DDL相關資訊
PL/SQL 過程已成功完成。

> col sql_redo format a410
> col sql_redo format a40
> select timestamp,sql_redo from v$logmnr_contents
2 where lower(sql_redo) like '%drop table%';

TIMESTAMP SQL_REDO
-------------- ----------------------------------------
10-9月 -07 drop table emp AS "BIN$EOgLIu3BSCysD4eTn
NFa7Q==$0" ;

> execute dbms_logmnr.end_logmnr;

PL/SQL 過程已成功完成。

H:顯示logmnr的資訊

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

相關文章