oracle logminer java_Oracle logminer
一、logminer的用途日志文件中存放著所有進行數(shù)據(jù)庫恢復的數(shù)據(jù),記錄了針對數(shù)據(jù)庫結構的每一個變化,也就是對數(shù)據(jù)庫操作的所有DML語句。logminer 工具即可以用來分析在線,也可以用來分析離線日志文件,即可以分析本身自己數(shù)據(jù)庫的重作日志文件,也可以用來分析其他數(shù)據(jù)庫的重作日志文件。總的說來,logminer工具的主要用途有:
1.跟蹤數(shù)據(jù)庫的變化:可以離線的跟蹤數(shù)據(jù)庫的變化,而不會影響在線系統(tǒng)的性能。
2. 回退數(shù)據(jù)庫的變化:回退特定的變化數(shù)據(jù),減少point-in-time recovery的執(zhí)行。
3.優(yōu)化和擴容計劃:可通過分析日志文件中的數(shù)據(jù)以分析數(shù)據(jù)增長模式。
二、安裝logminer
要安裝logminer工具,必須首先要運行下面這樣兩個腳本:
l. $ORACLE_HOME/rdbms/admin/dbmslm.sql
2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql
這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創(chuàng)建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創(chuàng)建DBMS_LOGMNR_D包,該包用來創(chuàng)建數(shù)據(jù)字典文件。
SQL>?@?/rdbms/admin/dbmslm.sql
程序包已創(chuàng)建。
授權成功。
同義詞已創(chuàng)建。
SQL>?@?/rdbms/admin/dbmslmd.sql
程序包已創(chuàng)建。
同義詞已創(chuàng)建。
SQL>?show?user
USER?為?"SYS"
三、使用logminer工具
下面將詳細介紹如何使用logminer工具。
1、創(chuàng)建數(shù)據(jù)字典文件(data-dictionary)
前面已經談到,logminer工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態(tài)性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動logminer時創(chuàng)建)組成。在使用logminer工具分析redo log文件之前,必須使用DBMS_LOGMNR_D 包將數(shù)據(jù)字典導出為一個文本文件。該字典文件是可選的,但是如果沒有它,logminer解釋出來的語句中關于數(shù)據(jù)字典中的部分(如表名、列名等)和數(shù)值都將是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'));
創(chuàng)建數(shù)據(jù)字典的目的就是讓logminer引用涉及到內部數(shù)據(jù)字典中的部分時為他們實際的名字,而不是系統(tǒng)內部的16進制。數(shù)據(jù)字典文件是一個文本文件,使用包DBMS_LOGMNR_D來創(chuàng)建。如果我們要分析的數(shù)據(jù)庫中的表有變化,影響到庫的數(shù)據(jù)字典也發(fā)生變化,這時就需要重新創(chuàng)建該字典文件。另外一種情況是在分析另外一個數(shù)據(jù)庫文件的重作日志時,也必須要重新生成一遍被分析數(shù)據(jù)庫的數(shù)據(jù)字典文件。首先指定數(shù)據(jù)字典文件的位置,也就是添加一個參數(shù)UTL_FILE_DIR,該參數(shù)值為服務器中放置數(shù)據(jù)字典文件的目錄。重新啟動數(shù)據(jù)庫,使新加的參數(shù)生效,然后創(chuàng)建數(shù)據(jù)字典文件。
SQL>?show?user
USER?為?"SYS"
SQL>?show?parameter?utl_file_dir
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
utl_file_dir?????????????????????????string
SQL>?alter?system?set?utl_file_dir='/u01/app/logminer'?scope=spfile;
系統(tǒng)已更改。
SQL>?shutdown?immediate
數(shù)據(jù)庫已經關閉。
已經卸載數(shù)據(jù)庫。
ORACLE?例程已經關閉。
SQL>?startup
ORACLE?例程已經啟動。
Total?System?Global?Area??238530560?bytes
Fixed?Size??????????????????1335724?bytes
Variable?Size?????????????150998612?bytes
Database?Buffers???????????83886080?bytes
Redo?Buffers????????????????2310144?bytes
數(shù)據(jù)庫裝載完畢。
數(shù)據(jù)庫已經打開。
SQL>?show?parameter?utl_file_dir
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
utl_file_dir?????????????????????????string??????/u01/app/logminer
SQL>?exec?dbms_logmnr_d.build(?'dictionary.ora',?'/u01/app/logminer');
PL/SQL?過程已成功完成。
開始之前
SQL>?show?user
USER?為?"SYS"
SQL>?select?SUPPLEMENTAL_LOG_DATA_MIN?from?v$database;
SUPPLEME
--------
NO
SQL>?alter?database?add?supplemental?log?data;
數(shù)據(jù)庫已更改。
SQL>?select?SUPPLEMENTAL_LOG_DATA_MIN?from?v$database;
SUPPLEME
--------
YES
supplemental logging(擴充日志):在通常情況下,redo log 只記錄的進行恢復所必需的信息,但是這些信息對于我們使用redo log進行一些其他應用時是不夠的,例如在 redo log中使用rowid唯一標識一行而不是通過Primary key,如果我們在另外的數(shù)據(jù)庫分析這些日志并想重新執(zhí)行某些dml時就可能會有問題,因為不同的數(shù)據(jù)庫其rowid代表的內容是不同的。在這時候就需要一些額外的信息(columns)加入redo log,這就是supplemental logging。supplemental logging分為兩個級別database_level and table_level,其中database_level級別分為兩種,minimal supplemental logging and identification key logging,其中minimal supplemental logging不會顯著增加系統(tǒng)的負擔,但是identification key logging對系統(tǒng)負擔比較大,在默認情況下oracle不會設置任何supplemental logging,但是如果要使用logminer,oracle建議至少設置minimal supplemental logging。我在使用logminer是,不設置minimal supplemental logging,從v$logmnr_contents中幾乎得不到任何信息。
2、創(chuàng)建要分析的日志文件列表
Oracle的重作日志分為兩種,在線(online)和離線(offline)歸檔日志文件,下面就分別來討論這兩種不同日志文件的列表創(chuàng)建。
(1)分析在線重作日志文件
SQL>?show?user
USER?為?"SYS"
SQL>?select?*?from?v$log;
GROUP#????THREAD#??SEQUENCE#??????BYTES??BLOCKSIZE????MEMBERS?ARC?STATUS???????????FIRST_CHANGE#?FIRST_TIME?????NEXT_CHANGE#?NEXT_TIME
----------?----------?----------?----------?----------?----------?---?----------------?-------------?--------------?------------?--------------
1??????????1?????????67???52428800????????512??????????1?YES?INACTIVE????????????????643449?14-12月-11???????????653614?15-12月-11
2??????????1?????????68???52428800????????512??????????1?NO??CURRENT?????????????????653614?15-12月-11???????2.8147E+14
3??????????1?????????66???52428800????????512??????????1?YES?INACTIVE????????????????614556?13-12月-11???????????643449?14-12月-11
SQL>?select?*?from?v$logfile;
GROUP#?STATUS??TYPE????MEMBER???????????????????????????????????????????????????????IS_
----------?-------?-------?------------------------------------------------------------?---
1?????????ONLINE??/u01/app/oracle/oradata/orcl/redo01.log??????????????????????NO
2?????????ONLINE??/u01/app/oracle/oradata/orcl/redo02.log??????????????????????NO
3?????????ONLINE??/u01/app/oracle/oradata/orcl/redo03.log??????????????????????NO
SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log',?dbms_logmnr.new);
PL/SQL?過程已成功完成。
SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log',?dbms_logmnr.addfile);
PL/SQL?過程已成功完成。
SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log',?dbms_logmnr.addfile);
PL/SQL?過程已成功完成。
刪除列表中的日志文件:exec dbms_logmnr.add_logfile('/u01/app/Oracle/oradata/orcl/redo03.log', dbms_logmnr.removefile);
關于這個日志文件列表中需要分析日志文件的個數(shù)完全由你自己決定,但這里建議最好是每次只添加一個需要分析的日志文件,在對該文件分析完畢后,再添加另外的文件。
3、使用logminer進行日志分析
(1)無限制條件
SQL>?exec?dbms_logmnr.start_logmnr(?dictfilename=>'/u01/app/logminer/dictionary.ora');
PL/SQL?過程已成功完成。
(2)有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數(shù)的設置(參數(shù)含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數(shù)我們可以限制只分析某一時間范圍的日志。
如下面的例子,我們僅僅分析2004年9月18日的日志,:
SQL> EXECUTE dbms_logmnr.start_logmnrdictfilename => '/u01/app/logminer/dictionary.ora',starttime => to_date('2006-02-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),endtime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:
SQL> EXECUTE dbms_logmnr.start_logmnr( dictfilename => '/u01/app/logminer/dictionary.ora', startscn => 20, endscn => 50);
參數(shù)
參數(shù)類型
默認值
含義
StartScn
數(shù)字型(Number)
0
分析重作日志中SCN≥StartScn日志文件部分
EndScn
數(shù)字型(Number)
0
分析重作日志中SCN≤EndScn日志文件部分
StartTime
日期型(Date)
1998-01-01
分析重作日志中時間戳≥StartTime的日志文件部分
EndTime
日期型(Date)
2988-01-01
分析重作日志中時間戳≤EndTime的日志文件部分
DictFileName
字符型(VARCHAR2)
0
字典文件,該文件包含一個數(shù)據(jù)庫目錄的快照。使用該文件可以使得到的分析結果是可以理解的文本形式,
4、觀察分析結果(v$logmnr_contents)
一共有四個表,詳細說明如下
V$LOGMNR_DICTIONARY-------查詢使用的數(shù)據(jù)字典文件
SQL>?select?filename?from?v$logmnr_dictionary;
FILENAME
--------------------------------------------------
/u01/app/logminer/dictionary.ora
V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數(shù)
SQL>?select?*?from?v$logmnr_parameters;
START_DATE?????REQUIRED_START?END_DATE????????START_SCN?REQUIRED_START_SCN????END_SCN????OPTIONS?INFO?????????????????????????????????STATUS
--------------?--------------?--------------?----------?------------------?----------?----------?--------------------------------?----------
01-1月?-11?????????614556??????????????????0??????????0??????????0???????????????????????????????????????????0
V$LOGMNR_LOGS-------查詢分析的日志文件
SQL>?select?filename?from?v$logmnr_logs;
FILENAME
--------------------------------------------------
/u01/app/oracle/oradata/orcl/redo03.log
/u01/app/oracle/oradata/orcl/redo01.log
/u01/app/oracle/oradata/orcl/redo02.log
V$LOGMNR_CONTENTS-------日志文件的內容
到現(xiàn)在為止,我們已經分析得到了重作日志文件中的內容。動態(tài)性能視圖v$logmnr_contents包含logminer分析得到的所有的信息。SQL> select scn,timestamp,sql_redo from v$logmnr_contents;
如果我們僅僅想知道某個用戶對于某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到用戶DB_ZGXT對表SB_DJJL所作的一切工作。
SQL>?select?operation,sql_redo,sql_undo?from?v$logmnr_contents?where?seg_owner='U1'?and?seg_name='TEST';
未選定行
operation 指的是操作 ,sql_redo 指的是實際操作,sql_undo 指的是用于取消的相反操作。
需要強調一點的是,視圖v$logmnr_contents中的分析結果僅在我們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是因為所有的logminer存儲都在PGA內存中,所有其他的進程是看不到它的,同時隨著進程的結束,分析結果也隨之消失。最后,使用過程DBMS_LOGMNR.END_LOGMNR終止日志分析事務,此時PGA內存區(qū)域被清除,分析結果也隨之不再存在。
SQL>?exec?dbms_logmnr.end_logmnr;
PL/SQL?過程已成功完成。
SQL>?select?*?from?v$logmnr_contents;
select?*?from?v$logmnr_contents
*
第?1?行出現(xiàn)錯誤:
ORA-01306:?在從?v$logmnr_contents?中選擇之前必須調用?dbms_logmnr.start_logmnr()
四、其他注意事項
我們可以利用logminer日志分析工具來分析其他數(shù)據(jù)庫實例產生的重作日志文件,而不僅僅用來分析本身安裝logminer的數(shù)據(jù)庫實例的redo logs文件。使用logminer分析其他數(shù)據(jù)庫實例時,有幾點需要注意:
1. logminer必須使用被分析數(shù)據(jù)庫實例產生的字典文件,而不是安裝logminer的數(shù)據(jù)庫產生的字典文件,另外必須保證安裝logminer數(shù)據(jù)庫的字符集和被分析數(shù)據(jù)庫的字符集相同。
2. 被分析數(shù)據(jù)庫平臺必須和當前l(fā)ogminer所在數(shù)據(jù)庫平臺一樣,也就是說如果我們要分析的文件是由運行在UNIX平臺上的Oracle 9i產生的,那么也必須在一個運行在UNIX平臺上的Oracle實例上運行l(wèi)ogminer,而不能在其他如Microsoft NT上運行l(wèi)ogminer。當然兩者的硬件條件不一定要求完全一樣。
3. logminer日志分析工具僅能夠分析Oracle 8以后的產品,對于8以前的產品,該工具也無能為力。
五、結語
logminer對于數(shù)據(jù)庫管理員(DBA)來講是個功能非常強大的工具,也是在日常工作中經常要用到的一個工具,借助于該工具,可以得到大量的關于數(shù)據(jù)庫活動的信息。其中一個最重要的用途就是不用全部恢復數(shù)據(jù)庫就可以恢復數(shù)據(jù)庫的某個變化。另外,該工具還可用來監(jiān)視或者審計用戶的活動,如你可以利用logminer工具察看誰曾經修改了那些數(shù)據(jù)以及這些數(shù)據(jù)在修改前的狀態(tài)。我們也可以借助于該工具分析任何Oracle 8及其以后版本產生的重作日志文件。另外該工具還有一個非常重要的特點就是可以分析其他數(shù)據(jù)庫的日志文件。總之,該工具對于數(shù)據(jù)庫管理員來講,是一個非常有效的工具,深刻理解及熟練掌握該工具,對于每一個數(shù)據(jù)庫管理員的實際工作是非常有幫助的。
六、例子
首先用一個用戶u1做一些dml操作:
SQL>?show?user
USER?為?"U1"
SQL>?delete?from?t1?where?id=3;
已刪除?1?行。
SQL>?insert?into?t1?values(3,'test');
已創(chuàng)建?1?行。
SQL>?commit;
提交完成。
SQL>?update?t1?set?value?=?'v3'?where?id?=?3;
已更新?1?行。
SQL>?commit;
提交完成。
SQL>?select?*?from?t1;
ID?VALUE
----------?----------
1?v1
2?v2
3?v3
開始分析:
SQL>?show?user
USER?為?"SYS"
SQL>?alter?system?switch?logfile;
系統(tǒng)已更改。
SQL>?exec?dbms_logmnr.add_logfile('/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2011_12_15/o1_mf_1_80_7gmqb6t5_.arc',?dbms_logmnr.new);
PL/SQL?過程已成功完成。
SQL>?exec?dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/logminer/dictionary.ora');
PL/SQL?過程已成功完成。
查看結果:
SQL>?select?filename?from?v$logmnr_dictionary;
FILENAME
--------------------------------------------------
/u01/app/logminer/dictionary.ora
SQL>?select?*?from?v$logmnr_parameters;
START_DATE?????REQUIRED_START?END_DATE????????START_SCN?REQUIRED_START_SCN????END_SCN????OPTIONS?INFO?????????????????????????????????STATUS
--------------?--------------?--------------?----------?------------------?----------?----------?--------------------------------?----------
01-1月?-11?????????653614??????????????????0??????????0??????????0???????????????????????????????????????????0
SQL>?select?filename?from?v$logmnr_logs;
FILENAME
--------------------------------------------------
/u01/app/oracle/oradata/orcl/redo02.log
SQL>?select?operation,sql_redo,sql_undo?from?v$logmnr_contents?where?seg_owner='U1'?and?seg_name='T1';
OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO
---------------?--------------------------------------------------?--------------------------------------------------
DELETE??????????delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?insert?into?"U1"."T1"("ID","VALUE")?values?('3','v
=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAC';??????????3');
INSERT??????????insert?into?"U1"."T1"("ID","VALUE")?values?('3','t?delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"
est');??????????????????????????????????????????????=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';
UPDATE??????????update?"U1"."T1"?set?"VALUE"?=?'v3'?where?"VALUE"??update?"U1"."T1"?set?"VALUE"?=?'test'?where?"VALUE
=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';?????????"?=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';
SQL>?select?operation,sql_redo,sql_undo,seg_owner,seg_name?from?v$logmnr_contents;
OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO???????????????????????????????????????????SEG_OWNER???????SEG_NAME
---------------?--------------------------------------------------?--------------------------------------------------?---------------?---------------
START???????????set?transaction?read?write;
DELETE??????????delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?insert?into?"U1"."T1"("ID","VALUE")?values?('3','v?U1??????????????T1
=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAC';??????????3');
INTERNAL
INSERT??????????insert?into?"U1"."T1"("ID","VALUE")?values?('3','t?delete?from?"U1"."T1"?where?"ID"?=?'3'?and?"VALUE"?U1??????????????T1
est');??????????????????????????????????????????????=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';
COMMIT??????????commit;
START???????????set?transaction?read?write;
UPDATE??????????update?"U1"."T1"?set?"VALUE"?=?'v3'?where?"VALUE"??update?"U1"."T1"?set?"VALUE"?=?'test'?where?"VALUE?U1??????????????T1
OPERATION???????SQL_REDO???????????????????????????????????????????SQL_UNDO???????????????????????????????????????????SEG_OWNER???????SEG_NAME
---------------?--------------------------------------------------?--------------------------------------------------?---------------?---------------
=?'test'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';?????????"?=?'v3'?and?ROWID?=?'AAAR3vAAFAAAACFAAB';
COMMIT??????????commit;
已選擇8行。
結束分析:
SQL>?exec?dbms_logmnr.end_logmnr;
PL/SQL?過程已成功完成。
總結
以上是生活随笔為你收集整理的oracle logminer java_Oracle logminer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【leetcode】104. Maxim
- 下一篇: 程序员,软件测试知多少?