Logminer是oracle從8i開始提供的用於分析重作日誌信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D兩個package,後邊的D是字典的意思。它既能分析redo log file,也能分析歸檔後的archive log file。在分析日誌的過程當中須要使用數據字典,通常先生成數據字典文件後使用,10g之後的版本還能夠使用在線數據字典。sql
Logminer能夠分析其它數據庫的重作日誌文件,可是必須使用重作日誌所在數據庫的數據字典,不然會出現沒法識別的亂碼。另外被分析數據庫的操做系統平臺最好和當前Logminer所在數據庫的運行平臺同樣,且block size相同。數據庫
LogMiner用於分析重作日誌和歸檔日誌所記載的事務操做。session
1、肯定數據庫的邏輯損壞時間。假定某個用戶執行drop table誤刪除了重要表sales,經過LogMiner能夠準肯定位該誤操做的執行時間和SCN值,而後經過基於時間恢復或者基於SCN恢復能夠徹底恢復該表數據。oracle
2、肯定事務級要執行的精細邏輯恢復操做。假定某些用戶在某表上執行了一系列DML操做並提交了事務,而且其中某個用戶的DML操做存在錯誤。經過LogMiner能夠取得任何用戶的DML操做及相應的UNDO操做,經過執行UNDO操做能夠取消用戶的錯誤操做。ide
3、執行後續審計。經過LogMiner能夠跟蹤Oracle數據庫的全部DML、DDL和DCL操做,從而取得執行這些操做的時間順序、執行這些操做的用戶等信息。工具
一、LogMiner基本對象ui
源數據庫(source database):該數據庫是指包含了要分析重作日誌和歸檔日誌的產品數據庫。操作系統
分析數據庫(mining database):該數據庫是指執行LogMiner操做所要使用的數據庫。日誌
LogMiner字典:LogMiner字典用於將內部對象ID號和數據類型轉換爲對象名和外部數據格式。使用LogMiner分析重作日誌和歸檔日誌時,應該生成LogMiner字典,不然將沒法讀懂分析結果。orm
二、LogMiner配置要求
(1)源數據庫和分析數據庫(源數據庫和分析數據庫能夠是同一個數據庫)
源數據庫和分析數據庫必須運行在相同硬件平臺上;
分析數據庫能夠是獨立數據庫或源數據庫;
分析數據庫的版本不能低於源數據庫的版本;
分析數據庫與源數據庫必須具備相同的字符集。
(2)LogMiner字典:LogMiner字典必須在源數據庫中生成。
(3)重作日誌文件
當分析多個重作日誌和歸檔日誌時,它們必須是同一個源數據庫的重作日誌和歸檔日誌;
當分析多個重作日誌和歸檔日誌時,它們必須具備相同的resetlogs scn;
當分析的重作日誌和歸檔日誌必須在Oracle8.0版本以上。
三、補充日誌(suppplemental logging)
重作日誌用於實現例程恢復和介質恢復,這些操做所須要的數據被自動記錄在重作日誌中。可是,重作應用可能還須要記載其餘列信息到重作日誌中,記錄其餘列的日誌過程被稱爲補充日誌。
默認狀況下,Oracle數據庫沒有提供任何補充日誌,從而致使默認狀況下LogMiner沒法支持如下特徵:
索引簇、鏈行和遷移行;
直接路徑插入;
摘取LogMiner字典到重作日誌;
跟蹤DDL;
生成鍵列的SQL_REDO和SQL_UNDO信息;
LONG和LOB數據類型。
所以,爲了充分利用LogMiner提供的特徵,必須激活補充日誌。在數據庫級激活補充日誌的示例以下:
SQL> conn /as sysdba
已鏈接。
SQL> alter database add supplemental log data;
數據庫已更改。
注意:這激活不用重啓數據庫,數據庫聯機便可。
LOGMNR 練習
1)DML 操做分析
06:02:11 SQL> conn /as sysdba
Connected.
06:02:17 SQL> show parameter utl
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
create_stored_outlines string
utl_file_dir string
06:02:19 SQL> conn scott/tiger
Connected.
06:04:04 SQL> select * from dept1;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
50 Account Beijing
60 Market ShangHai
70 Study BeiJing
80 Technolygy BeiJing
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
90 Market BeiJing
80 Sales BeiJing
80 Sales £?£?£?£?£?£?
11 rows selected.
06:04:18 SQL> delete from dept1 where deptno=80;
3 rows deleted.
06:04:35 SQL> select * from dept1;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
50 Account Beijing
60 Market ShangHai
70 Study BeiJing
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
90 Market BeiJing
8 rows selected.
06:04:42 SQL> commit;
Commit complete.
06:04:55 SQL> select * from dept1;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
50 Account Beijing
60 Market ShangHai
70 Study BeiJing
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
90 Market BeiJing
8 rows selected.
06:04:58 SQL> delete from dept1 where deptno=90;
1 row deleted.
06:05:12 SQL> commit;
Commit complete.
06:05:19 SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-01031: insufficient privileges
06:05:40 SQL> conn /as sysdba
Connected.
06:05:46 SQL> alter system switch logfile;
System altered.
06:05:52 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------
1 1 14 52428800 2 YES ACTIVE 1748577 02-APR-11
2 1 15 52428800 2 NO CURRENT 1756744 07-APR-11
3 1 10 52428800 2 YES INACTIVE 1663012 31-MAR-11
4 1 11 52428800 2 YES INACTIVE 1673418 01-APR-11
5 1 12 52428800 2 YES INACTIVE 1705162 02-APR-11
6 1 13 52428800 2 YES INACTIVE 1727817 02-APR-11
6 rows selected.
06:06:25 SQL> select name,sequence# from v$archived_log;
NAME SEQUENCE#
-------------------------------------------------- ----------
/disk1/arch/43_1_741450701.log 43
/disk1/arch/44_1_741450701.log 44
/disk1/arch/45_1_741450701.log 45
/disk1/arch/46_1_741450701.log 46
/disk1/arch/47_1_741450701.log 47
/disk1/arch/48_1_741450701.log 48
/disk1/arch/49_1_741450701.log 49
/disk1/arch/50_1_741450701.log 50
/disk1/arch/47_1_741450701.log 47
/disk1/arch/48_1_741450701.log 48
/disk1/arch/46_1_741450701.log 46
/disk1/arch/49_1_741450701.log 49
/disk1/arch/50_1_741450701.log 50
/disk1/arch/51_1_741450701.log 51
/disk1/arch/1_1_746079267.log 1
/disk1/arch/2_1_746079267.log 2
/disk1/arch/3_1_746079267.log 3
NAME SEQUENCE#
-------------------------------------------------- ----------
/disk1/arch/4_1_746079267.log 4
/disk1/arch/5_1_746079267.log 5
/disk1/arch/6_1_746079267.log 6
/disk1/arch/7_1_746079267.log 7
/disk1/arch/8_1_746079267.log 8
/disk1/arch/9_1_746079267.log 9
/disk1/arch/10_1_746079267.log 10
/disk1/arch/11_1_746079267.log 11
/disk1/arch/12_1_746079267.log 12
/disk1/arch/13_1_746079267.log 13
/disk1/arch/14_1_746079267.log 14
28 rows selected.
06:07:01 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/disk1/arch/14_1_746079267.log',options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
06:08:19 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.
06:09:08 SQL> col username for a8
06:09:26 SQL> col sql_redo for a50
06:09:36 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
06:10:03 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='SCOTT.DEPT1';
no rows selected
06:14:38 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='DEPT1';
USERNAME SCN TIMESTAMP SQL_REDO
-------- ---------- ------------ --------------------------------------------------
1756706 07-APR-11 delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'
and "DNAME" = 'Technolygy' and "LOC" = 'BeiJing' a
nd ROWID = 'AAANaPAAEAAAAAcAAD';
1756707 07-APR-11 delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'
and "DNAME" = 'Sales' and "LOC" = 'BeiJing' and RO
WID = 'AAANaPAAEAAAAAgAAC';
1756707 07-APR-11 delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'
and "DNAME" = 'Sales' and "LOC" = '£?£?£?£?£?£?' a
nd ROWID = 'AAANaPAAEAAAAAgAAD';
1756728 07-APR-11 delete from "SCOTT"."DEPT1" where "DEPTNO" = '90'
and "DNAME" = 'Market' and "LOC" = 'BeiJing' and R
OWID = 'AAANaPAAEAAAAAgAAA';
06:15:09 SQL>
結束日誌分析
09:18:14 SQL> execute dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
2)DDL 操做分析
06:20:46 SQL> conn scott/tiger
Connected.
06:20:54 SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------------------------------------ -------------- ----------
EMP TABLE
DEPT TABLE
BONUS TABLE
SALGRADE TABLE
QUEST_SL_TEMP_EXPLAIN1 TABLE
EMP1 TABLE
ERRLOG TABLE
PART_SALES TABLE
T01 TABLE
DEPT1 TABLE
TT01 TABLE
USERLOG TABLE
ERRORS TABLE
EMP_HIS TABLE
14 rows selected.
06:21:02 SQL> drop table emp_his purge;
Table dropped.
06:21:21 SQL> drop table tt01 purge;
Table dropped.
06:21:32 SQL> drop table t01 purge;
Table dropped.
06:21:38 SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------------------------------------ -------------- ----------
EMP TABLE
DEPT TABLE
BONUS TABLE
SALGRADE TABLE
QUEST_SL_TEMP_EXPLAIN1 TABLE
EMP1 TABLE
ERRLOG TABLE
PART_SALES TABLE
DEPT1 TABLE
USERLOG TABLE
ERRORS TABLE
11 rows selected.
06:22:17 SQL> conn /as sysdba
Connected.
06:22:21 SQL> alter system switch logfile;
System altered.
06:22:23 SQL> show parameter utl
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
create_stored_outlines string
utl_file_dir string
06:22:33 SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;
System altered.
shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
06:23:59 SQL> startup
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 1220360 bytes
Variable Size 188743928 bytes
Database Buffers 331350016 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
06:24:24 SQL> show parameter utl
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
create_stored_outlines string
utl_file_dir string /home/oracle/logmnr
06:26:28 SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
PL/SQL procedure successfully completed.
06:27:46 SQL> select name,sequence# from v$archived_log;
NAME SEQUENCE#
-------------------------------------------------- ----------
/disk1/arch/44_1_741450701.log 44
/disk1/arch/45_1_741450701.log 45
/disk1/arch/46_1_741450701.log 46
/disk1/arch/47_1_741450701.log 47
/disk1/arch/48_1_741450701.log 48
/disk1/arch/49_1_741450701.log 49
/disk1/arch/50_1_741450701.log 50
/disk1/arch/47_1_741450701.log 47
/disk1/arch/48_1_741450701.log 48
/disk1/arch/46_1_741450701.log 46
/disk1/arch/49_1_741450701.log 49
/disk1/arch/50_1_741450701.log 50
/disk1/arch/51_1_741450701.log 51
/disk1/arch/1_1_746079267.log 1
/disk1/arch/2_1_746079267.log 2
/disk1/arch/3_1_746079267.log 3
/disk1/arch/4_1_746079267.log 4
NAME SEQUENCE#
-------------------------------------------------- ----------
/disk1/arch/5_1_746079267.log 5
/disk1/arch/6_1_746079267.log 6
/disk1/arch/7_1_746079267.log 7
/disk1/arch/8_1_746079267.log 8
/disk1/arch/9_1_746079267.log 9
/disk1/arch/10_1_746079267.log 10
/disk1/arch/11_1_746079267.log 11
/disk1/arch/12_1_746079267.log 12
/disk1/arch/13_1_746079267.log 13
/disk1/arch/14_1_746079267.log 14
/disk1/arch/15_1_746079267.log 15
28 rows selected.
06:28:09 SQL>execute dbms_logmnr.add_logfile(logfilename=>'/disk1/arch/15_1_746079267.log',options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
06:28:58 SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
PL/SQL procedure successfully completed.
06:30:58 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents
06:31:24 2 where lower(sql_redo) like '%table%';
USERNAME SCN TIMESTAMP SQL_REDO
-------- ---------- ------------ --------------------------------------------------
1757390 07-APR-11 drop table emp_his purge;
1757409 07-APR-11 drop table tt01 purge;
1757425 07-APR-11 drop table t01 purge;
06:31:45 SQL>
結束日誌分析
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
oracle視頻教程請關注:http://down.51cto.com/4202939/up