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 &
好了,等收到處理完成的短信,登錄數據庫查看即可。