使用logminer日志分析工具来实现[总结]logminer使用方法 
作者:txfy   发表时间:2003-09-05 10:51:17 前一段时间我想查询数据库中一个表的纪录的最后修改时间,大家给我提出了很多方法,其中logminer我觉得是比较好的一种,就找了些帮助文档,并进行了研究测试,下面公布一下使用过程,以及期间碰到的问题和解决方法,跟大家共享。其中oracle home的路径大家自己根据我的路径进行修改。 
1:介绍:dbms_logmnr是oracle在oracle8i所提供的新package。它主要用于分析log file文件(包括online redo log file,archived log file),将log file中的信息转存到v$logmnr_contents中,从而获取对oracle数据库操作的历史信息。它不仅可以分析oracle8i的log file,也可以分析oracle8的log file。信息主要包括在你分析的时间限制内数据库数据作了些什么变更,执行了哪些语句。 
2:使用方法 
       1)打开<sid>init.ora文件,加入utl_file_dir=d:\oracle(注:改为自己的路径,是logminer使用文件的默认路径),然后应用新的设置打开oracle数据库。 
        2)执行SQL>。 execute dbms_logmnr_d.build('shwdict.ora','D:\oracle'); ,(注:将生成d:\oracle\shwdict.ora文件,此文件可以以后重复使用,但不能同时用于几个logmnr)用于生成数据字典;如果没有dbms_logmnr_d包,需手工执行@d:\oracle\ora8\rdbms\admin\dbmslmd.sql;如果执行过程中报下标越界错误,则需要打开@d:\oracle\ora8\rdbms\admin\dbmslmd.sql文件,将其中的TYPE col_desc_array IS VARRAY(513) OF col_description的513加大,我是改成了1513,保存文件重新执行@d:\oracle\ora8\rdbms\admin\dbmslmd.sql;(注:都要以sysdba身份登陆执行)。 
      3)将要分析的日志文件加入要分析的log list中,察看有哪些日志文件可以用select * from v$logfile;查询已经加入那些可以用select * from v$logmnr_logs(注:查询必须在同一个会话中查询,单独开查询将查不到)语句如下:execute dbms_logmnr.add_logfile('d:\oracle\oradata\shw\redo01_1.log',dbms_logmnr.new); 
execute dbms_logmnr.add_logfile('d:\ORACLE\ORADATA\ORA\REDO02_1.LOG',dbms_logmnr.addfile); 
execute dbms_logmnr.add_logfile('d:\ORACLE\ORADATA\ORA\REDO03_1.LOG',dbms_logmnr.addfile); 
如果需要从分析列表里去掉一个文件用 
('d:\ORACLE\ORADATA\ORA\REDO03_1.LOG',dbms_logmnr.removefile);      
        4)更改会话时间表达方式(注一定要在本会话下修改,我开始发生错误就是因为在别的会话里修改的,如果允许,可以将数据库默认的时间表达方式修改掉)会话内修改为alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 系统设置在注册表。 
        5)查询分析的日志文件包含的scn范围和日期范围。 
  select low_time,high_time,low_scn,next_scn from v$logmnr_logs;会列出你加入的日志文件的以上信息。 
     6)执行分析: 
dbms_logmnr.start_logmnr( 
     dictfilename => 'd:\oracle\shwdict.ora',startscn=>xxxxxx,endscn=>xxxxx,starttime => to_date('20030501 12:15:00','yyyymmdd hh24:mi:ss'), endtime => to_date('20030501 15:40:30','yyyymmdd hh24:mi:ss')); 
要注意scn范围和日期格式,格式要与你修改的一样。 
     7:查询 
Select SCN,timestamp, session# session_num, sql_redo 
From V$LOGMNR_CONTENTS 
Order by 1 
具体要查询什么内容可以自己修改。

解决方案 »

  1.   

    用触发器截获对表操作的具体sql语句(9i开始才支持)
      

  2.   

    触发器如何取得表中更改的记录呢?(或sql语句也行).我是新手,请详细点,多指教!谢谢
      

  3.   

    oracle数据库允许对表上最多创建12个触发器,
    before insert
    before insert for each row
    after  insert
    after  insert for each row
    before update
    before update for each row
    after  update
    after  update for each row
    before delete
    before delete for each row
    after  delete
    after  delete for each row
    在这些相应的触发器中我们可以通过
    :new.字段名   --字段新值
    :old.字段名   --字段旧值
    来实现我们的操作
      

  4.   

    先在数据库中建几张表,用来记录delete\update\insert时候的信息。
    使用触发器来记录对原表的信息。