数据库进阶系列之三:使用Logminer解析Oracle日志
有時候我們會被問到一個數據庫對象的創建時間,這簡單,可以查user_objects視圖,不過如果再深入些,這個表的數據什么時候被什么人修改過?這個在沒有工具幫助的情況下是不容易回答的,我們只知道這些記錄存在于Redo日志中,但這些日志文件并不是人直接可讀的,這個時候Logminer就能派上用場了。下面簡單舉例(實驗環境:Windows Vista + Oracle 11.1.0.7.0):
H:\>sqlplus / as sysdba
SQL> alter database add supplemental log data;
/*該命令用于啟動supplemental logging功能,以使Logminer獲得更加詳細的信息。如果該功能未啟用,Logminer解析結果中的username,session_info等信息都被置為‘UNKNOWN’,這樣我們就無從得知操作是由哪個用戶執行的了。另外,也可能導致某些操作無法解析出來,比如在測試中我發現如果該功能未啟用,而我更新的表是一張未設置主鍵的表,那么在解析結果中我始終找不到對應的UPDATE操作。欲禁用此項功能:alter database drop supplemental log data;*/
SQL> shutdown immediate
SQL> startup
SQL> alter system switch logfile;
/*將日志切換到下一組以便在解析之后可以使用時間條件進行過濾,以免日志記錄太多看花眼*/
SQL> exit
/*以下執行一些簡單的操作,這些操作會被記錄到切換過后的Redo日志中*/
H:\>sqlplus morven3/morven3
SQL> create table tab1(fid number,fval varchar(20));
SQL> insert into tab1 values(1,'abc');
SQL> /
SQL> /
SQL> /
SQL> commit;
SQL> update tab1 set fval='xyz' where fid=1;
SQL> commit;
SQL> delete from tab1;
SQL> commit;
SQL> exit
H:\>sqlplus / as sysdba
SQL> select * from v$log where status='CURRENT';
/*查找當前使用的日志的組號*/
SQL> SELECT MEMBER from v$logfile where group#=3;
/*根據查到的當前日志組號,查找日志文件,得到日志文件路徑,如“C:\DATABASE\ORADATA\SIDORCL\REDO03.LOG”*/
SQL> exec dbms_logmnr.add_logfile('C:\DATABASE\ORADATA\SIDORCL\REDO03.LOG',dbms_logmnr.new);
/*向Logminer指定要解析的日志文件*/
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
/*向Logminer指定使用當前數據庫的數據字典進行解析(只有根據數據字典才能將對象ID解析成對象名稱,增加可讀性)*/
SQL> select t.* from v$logmnr_contents t where timestamp >sysdate-10/24/60 and username='MORVEN3';
/*通過上面幾個步驟,動態視圖v$logmnr_contents就有了解析出來的日志記錄。這里你可以簡地通過時間過濾一下,比如像上面的查找10分鐘內的操作,當然10分鐘內可能還是有不少日志記錄,你可以加其它的過濾條件,比如用戶名。根據上面的語句,我們查到13條記錄,可以看“SQL_REDO”字段,這些記錄分別是:
create table tab1(fid number,fval varchar(20));
insert into "MORVEN3"."TAB1"("FID","FVAL") values ('1','abc');
insert into "MORVEN3"."TAB1"("FID","FVAL") values ('1','abc');
insert into "MORVEN3"."TAB1"("FID","FVAL") values ('1','abc');
insert into "MORVEN3"."TAB1"("FID","FVAL") values ('1','abc');
update "MORVEN3"."TAB1" set "FVAL" = 'xyz' where "FVAL" = 'abc' and ROWID = 'AAARJ1AAFAAAACFAAA';
update "MORVEN3"."TAB1" set "FVAL" = 'xyz' where "FVAL" = 'abc' and ROWID = 'AAARJ1AAFAAAACFAAB';
update "MORVEN3"."TAB1" set "FVAL" = 'xyz' where "FVAL" = 'abc' and ROWID = 'AAARJ1AAFAAAACFAAC';
update "MORVEN3"."TAB1" set "FVAL" = 'xyz' where "FVAL" = 'abc' and ROWID = 'AAARJ1AAFAAAACFAAD';
delete from "MORVEN3"."TAB1" where "FID" = '1' and "FVAL" = 'xyz' and ROWID = 'AAARJ1AAFAAAACFAAA';
delete from "MORVEN3"."TAB1" where "FID" = '1' and "FVAL" = 'xyz' and ROWID = 'AAARJ1AAFAAAACFAAB';
delete from "MORVEN3"."TAB1" where "FID" = '1' and "FVAL" = 'xyz' and ROWID = 'AAARJ1AAFAAAACFAAC';
delete from "MORVEN3"."TAB1" where "FID" = '1' and "FVAL" = 'xyz' and ROWID = 'AAARJ1AAFAAAACFAAD';
另外,通過“SESSION_INFO”字段,我們還能定位出具體是哪個用戶在哪臺機器上執行的操作,我們可以看一個“SESSION_INFO”的例子:
login_username=MORVEN3 client_info= OS_username=domain1\hmy Machine_name=domain1\EV001EEC1FF000 OS_terminal=EV001EEC1FF000 OS_process_id=4064:2560 OS_program_name=sqlplus.exe
v$logmnr_contents視圖中還有其它一系列的字段,SEG_TYPE_NAME,TABLE_SPACE,SQL_UNDO等等*/
SQL> exec dbms_logmnr.end_logmnr
/*退出Logminer*/
?
轉載于:https://www.cnblogs.com/morvenhuang/archive/2010/04/26/1721327.html
總結
以上是生活随笔為你收集整理的数据库进阶系列之三:使用Logminer解析Oracle日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Gearman,搭建异步分布式计算平
- 下一篇: Outlook中自定义新邮件提醒