[生產庫實戰] 如何合理的使用logmnr進行日誌挖掘,並對生產庫影響最小化

Oracle Logmnr這個工具怎麼用這裏就不詳細說,可以查看官方文檔,網上的文檔也一大堆,自己找吧。我這裏就直接上乾貨了。


--創建Oracle目錄

select * from dba_directories;

create directory archivelog_dir as '/archivelog1/temp_archivelog/';

--grant read, write on directory archivelog_dir to zhanghui;


--歸檔日誌路徑信息表(tmp_archive_log),主要是保存要挖掘日誌的路徑

--注:要爲該表加狀態標誌位,0爲未挖掘,1爲已挖掘

create table tmp_archive_log as 

select name, 0 flag from v$archived_log 

where first_time>=to_date('2012-12-25 13:55:00','yyyy-mm-dd hh24:mi:ss')

  and first_time<to_date('2012-12-25 15:05:00','yyyy-mm-dd hh24:mi:ss');


--爲挖掘日誌出的內容創建表,並根據具體需要選擇要提取的字段

create table zhanghui.logmnr_contents

as

select timestamp,log_id,seg_owner,seg_name,table_name,username,operation,sql_redo,sql_undo from v$logmnr_contents where 1=2;


--批量處理挖掘日誌,只分析幾個歸檔日誌手動處理還好,如果要分析上百個,還手動搞,那就傻了,所以做事的講究方法,2分鐘1.5G的歸檔,分析兩個小時的,怎麼玩?

--注:由於挖掘出的日誌內容保存在內存中,操作會話退出就丟失了,故這裏採用單個日誌挖掘,然後將數據保存到一張表中,完成後commit。以免對DB的memory造成衝擊,影響性能,生產庫操作一定要保證不影響業務的情況下進行各類操作。

$ sqlplus / as sysdba

create procedure proc_logmnr_batch
IS
  vCur                      sys_refcursor;
  v_sql_dirarclog           varchar2(2000);
  v_sql_arclog              varchar2(2000);
begin
  open vCur for select name from zhanghui.tmp_archive_log where flag=0;
  loop
    fetch vCur
      into v_sql_dirarclog;
    exit when vCur%notfound;
  v_sql_arclog:='begin sys.dbms_logmnr.add_logfile (logfilename=>'''||v_sql_dirarclog||''',options=>sys.dbms_logmnr.NEW); end;';
  execute immediate v_sql_arclog;
  begin sys.dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog); end;
    insert into /*+ append */ zhanghui.logmnr_contents 
    select timestamp,log_id,seg_owner,seg_name,table_name,username,operation,sql_redo,sql_undo from 
    v$logmnr_contents
    --where table_name='<TABLE_NAME>' and OPERATION='DELETE';
  begin sys.dbms_logmnr.end_logmnr; end;
  UPDATE zhanghui.tmp_archive_log set flag = 1 where name= v_sql_dirarclog;
  commit;
  end loop;
    --跑完了發條短信,調用短信接口
    close vCur;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    --報錯了發條短信,調用短信接口
    --dbms_output.put_line(sqlerrm); 
END proc_logmnr_batch;

 

--採用操作系統調用存儲過程腳本

$cat proc_logmnr_batch.sh

#!/bin/bash
sqlplus / as sysdba <<EOF
set newpage 0
set linesize 1000             
set pagesize 0
spool proc_logmnr_batch.txt;
exec proc_logmnr_batch;
spool off
quit;
EOF


--賦予執行權限

$chmod +x proc_logmnr_batch.sh

--後臺調用執行

$nohup ./proc_logmnr_batch.sh &


好了,等收到處理完成的短信,登錄數據庫查看即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章