oracle 10g中logminer的使用

liqilin0429發表於2010-09-17

第一:建立dbms_logmnr包
以sys使用者執行下面四個指令碼
dbmslm.sql
@/u01/oracle/rdbms/admin/dbmslm.sql
dbmslmd.sql
@/u01/oracle/rdbms/admin/dbmslmd.sql

第二 修改引數檔案,指定分析資料的存放位置
SQL> alter system set utl_file_dir='/u01/bak_qilin/logminer' scope=spfile;

第三 關閉,啟動
shutdown immediate
startup;

第四 建立資料字典檔案
以sys使用者執行以下命令:
SQL> execute dbms_logmnr_d.build(dictionary_filename => 'sqltrace.ora',dictionary_location => '/u01/bak_qilin/logminer');
或者 execute dbms_logmnr_d.build('sqltrace.ora','/u01/bak_qilin/logminer',dbms_logmnr_d.store_in_flat_file);

第五 建立日誌分析表
首先 查詢線上日誌檔案用 SQL> select * from v$logfile;
然後 執行以下命令:
第1個日誌檔案需要以dbms_lognr.new的方式新增,從第2個開始用dbms_logmnr.addfile方式新增
EXECUTE dbms_logmnr.add_logfile('/u01/oradata/qilin/redo01.log', dbms_logmnr.new);
EXECUTE dbms_logmnr.add_logfile('/u01/oradata/qilin/redo02.log', dbms_logmnr.addfile);
EXECUTE dbms_logmnr.add_logfile('/u01/oradata/qilin/redo03.log', dbms_logmnr.addfile);
以下的載入方式也是可以的
SQL> exec dbms_logmnr.add_logfile(options => dbms_logmnr.new,logfilename=>'/u01/oradata/qilin/redo01.log');
SQL> exec dbms_logmnr.add_logfile(options => dbms_logmnr.addfile,logfilename=>'/u01/oradata/qilin/redo02.log');
SQL> exec dbms_logmnr.add_logfile(options => dbms_logmnr.addfile,logfilename=>'/u01/oradata/qilin/redo03.log');
    可以分析以歸檔的離線重做日誌檔案,當然這要求資料庫執行在歸檔模式。
    如果需要從分析列表裡去掉一個檔案用
    EXECUTE dbms_logmnr.add_logfile('d:\ORACLE\ORADATA\ORA\REDO03_1.LOG',dbms_logmnr.removefile);
    檢視被當前會話載入的日誌:SQL> select filename,low_scn,next_scn from v$logmnr_logs;

第六 啟動logminer進行分析
首先 修改sysdate格式; alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';
    其次 從v$logmnr_logs中查詢low_time,high_time,low_scn,next_scn資訊;
SQL> select low_time,high_time,low_scn,next_scn from v$logmnr_logs;
LOW_TIME            HIGH_TIME              LOW_SCN   NEXT_SCN
------------------- ------------------- ---------- ----------
2010-05-25:16:47:37 2010-05-26:10:30:04     629155     650681
2010-05-26:10:30:04 2010-05-31:11:07:36     650681     673807
2010-05-31:11:07:36 1988-01-01:00:00:00     673807 2.8147E+14
然後 分析logminer
SQL> exec dbms_logmnr.start_logmnr(dictfilename =>'/u01/bak_qilin/logminer/sqltrace.ora',startscn=>650681,endscn=>673806,starttime =>to_date('2010-05-24 09:00:00','yyyy-mm-dd hh24:
mi:ss'),endtime=>to_date('2010-05-31 09:00:00','yyyy-mm-dd hh24:mi:ss'));
    PL/SQL procedure successfully completed.
    或者
    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\product\logminer\sqltrace.ora',startscn=>2060597,endscn=>2092926,starttime=>to_date('2010-05-24 00:00:00'),     
    endtime=>to_date('2010-05-31 00:00:00'));
    或者
    SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog +  dbms_logmnr.committed_data_only + dbms_logmnr.print_pretty_sql);

    第七 檢視日誌分析的結果
執行以下命令:sql> select username, sql_redo, sql_undo from v$logmnr_contents where username = ‘test’ and peration = ‘delete’;

第八 關閉logminer
執行命令:sql> exec dbms_logmnr.end_logmnr

select * from v$log_history;   select * from v$logmnr_logs;  

    一共有四個表,詳細說明如下
V$LOGMNR_DICTIONARY-------查詢使用的資料字典檔案
V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的引數
V$LOGMNR_LOGS      -------查詢分析的日誌檔案
V$LOGMNR_CONTENTS  -------日誌檔案的內容
在查詢v$logmnr_contents內容時,where限制條件一定要用大寫.

Seg_name  : 表名;
Scn       : SCN 號碼
Sql_redo  : 所作的sql 語句
Sql_undo  : 對應sql_redo, 恢復用的sql 語句
Timestamp : sql 發出的具體時間
Operation : sql 的型別,分為INSERT, UPDATE, START(set …), COMMIT(commit), INTERNAL等
Session#  : 發出該操作的 session 

select operation,sql_redo,sql_undo from v$logmnr_contents;
SELECT sql_redo FROM v$logmnr_contents WHERE username='SYS' AND tablename='TT';
select scn,sql_redo from v$logmnr_contents where seg_owner='SYSTEM' and seg_name='ENDUSER' and upper(operation)='INSERT';
SELECT timstamp,sql_redo FROM v$logmnr_contents WHERE upper(sql_redo) like '%insert%';

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20976446/viewspace-674324/,如需轉載,請註明出處,否則將追究法律責任。

相關文章