测试环境:
OS:window XP
Db:oracle 9i
注意:所有操作,要在一个会话中进行!!!
一、 oracle logminer简介
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。信息主要包括在你分析的时间限制内数据库数据作了些什么变更,执行了哪些语句。
二、 logminer日志分析过程
1. 打开init.ora文件,加入utl_file_dir=d:\logminer(注:改为自己的路径,是logminer使 用文件的默认路径),然后应用新的设置打开oracle数据库。
2. 执行SQL>execute dbms_logmnr_d.build('shwdict.ora','D:\logminer'); ,(注:将生成d:\logminer\shwdict.ora文件,此文件可以以后重复使用,但不能同时用于几个logmnr)用于生成数据字典;如果没有dbms_logmnr_d包,需手工执行@D:\oracle\rdbms\admin\dbmslmd.sql;如果执行过程中报下标越界错误,则需要打开@ D:\oracle\rdbms\admin \dbmslmd.sql文件,将其中的TYPE col_desc_array IS VARRAY(513) OF col_description的513加大,我是改成了1513,保存文件重新执行@ D:\oracle\rdbms\admin \dbmslmd.sql;(注:都要以sysdba身份登陆执行)。
3. 将要分析的日志文件加入要分析的log list中
1. 察看有哪些日志文件可以用
select * from v$logfile;
2. 查询已经加入的日志文件
select * from v$logmnr_logs;(注:查询必须在同一个会话中查询,单独开查询将查不到)
3. 添加日志文件到分析的log list
execute dbms_logmnr.add_logfile('d:\logminer\oradata\shw\redo01_1.log',dbms_logmnr.new);
execute dbms_logmnr.add_logfile('d:\logminer\ORADATA\ORA\REDO02_1.LOG',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('d:\logminer\ORADATA\ORA\REDO03_1.LOG',dbms_logmnr.addfile);
4. 如果需要从分析列表里去掉一个文件用
execute dbms_logmnr.add_logfile ('d:\logminer\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. 执行分析:
1. 无限制条件
SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName=>' e:\oracle\logs\ v816dict.ora ');
2. 有限制条件
通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。如下面的例子,我们仅仅分析2009年3月10日的日志,
通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志:
SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName => ' e:\oracle\logs\ v816dict.ora ',StartTime => to_date('2009-03-10 00:00:00','YYYY-MM-DD HH24:MI:SS'),EndTime => to_date(''2009-03-10 23:59:59','YYYY-MM-DD HH24:MI:SS '));
通过设置起始SCN和截至SCN来限制要分析日志的范围:
SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName => ' e:\oracle\logs\ v816dict.ora ', StartScn => 20,EndScn => 50);
表1 DBMS_LOGMNR.START__LOGMNR过程参数含义 参数 参数类型 默认值 含义:
StartScn 数字型(Number) 0 分析重作日志中SCN≥StartScn日志文件部分
EndScn 数字型(Number) 0 分析重作日志中SCN≤EndScn日志文件部分
StartTime 日期型(Date) 1998-01-01 分析重作日志中时间戳≥StartTime的日志文件部分
EndTime 日期型(Date) 2988-01-01 分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName 字符型(VARCHAR2) 字典文件,该文件包含一个数据库目录的快照。
使用该文件可以使得到的分析结果是可以理解的文本形式,而非系统内部的16进制 Options BINARY_INTEGER 0 系统调试参数,实际很少使用。
7. 查询logminer分析结果:
Select SCN,timestamp, session# session_num, sql_redo
From V$LOGMNR_CONTENTS
Order by 1;
注:具体要查询什么内容可以自己修改。
8. 观察分析结果(v$logmnr_contents)
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户DB_ZGXT对表SB_DJJL所作的一切工作。
SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='DB_ZGXT' AND tablename='SB_DJJL';
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。
这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
三、 日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在:
1、SQL> exec DBMS_LOGMNR.END_LOGMNR;
2、也可以直接退出SQL*PLUS,它会自动终止。
(未完待续)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/751371/viewspace-566637/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/751371/viewspace-566637/