我们在执行delete,insert,update的语句时,有时间会误操作,将数据更新错误,有时数据错误后,想知道是什么语句和什么时间执行了什么样的sql,这样就需要从历史的日志中将执行过的sql抓取出来进行分析,在oracle中logmnr是非常方便的可以从日志文件中提取对应的执行sql列表;

         为了分析online log和archive log我们首先需要知道这些日志文件的存在物理路径,这时可以通过查询v$logfile来获取到online日志的路径和文件名对应sql:
             select * from v$logfile;

         查询v$archived_log表可以知道归档日志的路径及文件名:

             select * from v$archived_log;

        查到online log的文件和archived log文件后,即可登录sqlplus 进行日志的分析了,分析共以下几步:

            (1)  操作系统命令提示符下执行:

                     sqlplus /nolog

            (2) sqlplus命令符下执行: 
                     connect / as sysdba;由于logmnr对应的包中默认执行权限为dba,因此可以直接用dba来执行相应的分析命令,当然也可以使用grant将对应包及对象的执行权限符给某个用户,这样也可以使用该用户登录oracle数据库,执行相应的分析命令;

exec dbms_logmnr.add_logfile(logfilename=>'&logPathFile',options=>dbms_logmnr.new);

--将日志文件加到logmnr中,注意logmnr是基于session的,因此如果退出当前登陆用户,则对应的分析结果丢失,需要重新执行一遍操作;

(4)exec dbms_logmnr.add_logfile(logfilename=>'&logPathFile',options=>dbms_logmnr.addfile); --继续往logmnr中添加日志文件,原来我想试一下这个add_logfile是否支持*添加批量文件呢,结果不好使.

(5) exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); --开始执行分析

(6) select timestamp,sql_redo,sql_undo from v$logmnr_contents where username='SCOTT'and table_name='T_TEST'; --查询v$logmnr_contents来查询分析结果;

(7) exec dbms_logmnr.end_logmnr;