一、Oracle日志
Oracle的日志分为联机重做日志(Onlineredo log)和归档日志(Archivedredolog)。这两类日志记录了每一个数据库事物。也就是说,这些日志文件中保存了自Oracle运行以来所有的数据修改操作,当然也包括所有对数据的DML操作。
一般数据库至少要有2个联机重做日志组。当一个联机重做日志1被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,同时联机重做日志1就会被拷贝到归档目录中进行归档。当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志1,就这样反复进行。
Oracle8i以前并没有提供任何手段可以让用户来分析重要日志中的内容。但所在Oracle8i以后提供了logminer来分析这些日志文件。
二、LogMiner的安装和使用
2.1 LogMiner的安装
运行以下两个脚本:
$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE_HOME/rdbms/admin/dbmslmd.sql
这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
2.2建立数据字典文件
首先在init.ora初始化参数文件中,指定数据字典文件的位置,也就是添加一个参数UTL_FILE_DIR,该参数值为服务器中放置数据字典文件的目录。如:UTL_FILE_DIR= (/u11/logs)
然后创建数据字典:
begin
sys.dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora',dictionary_location=>'/u11/logs');
end;
其中,dictionary.ora是数据字典文件的文件名(可任意)。整个创建过程,可能需要十几分钟到一个小时,视该数据库的object个数以及繁忙程度而定。完成后,会在/u11/logs目录下看到一个名为dictionary.ora的文件。
2.3选择要分析的文件
日志文件和归档日志文件的数量是非常多的,数据量也数据量非常之大。因此事实上不可能把所有的日志文件都分析一遍(要做也行,不过要保证有足够的空间和时间,并且不怕影响数据库性能),通常选取感兴趣的时间段内的日志进行分析。
选取日志文件的操作如下例:
begin
sys.dbms_logmnr.add_logfile(logfilename=>'/02/admin/mydb/redo01.log',options=>sys.dbms_logmnr.NEW);
end;
一次只能选取一个文件。若要增加文件,使用下例:
Begin
sys.dbms_logmnr.add_logfile(logfilename=>'/02/admin/mydb/redo02.log',options=>sys.dbms_logmnr.ADDFILE);
end;
若想去掉一个已经选取或增加的文件,使用REMOVEFILE:
begin
sys.dbms_logmnr.add_logfile(logfilename=>'/02/admin/mydb/redo02.log',options=>sys.dbms_logmnr.REMOVEFILE);
end;
如此反复操作,可以把所有要分析的文件都选取进去。
2.4分析日志文件
begin
sys.dbms_logmnr.start_logmnr(dictfilename =>'dictionary.ora');
end;
分析过程根据所选取文件的数据量,可能需要几个小时。有时候,DBA可能并不需要这些日志文件中所有的数据。Oracle容许用户只分析指定时间段或者指定SCN段的数据,语法示例如下:
alter sessionset nls_date_language=american;
alter sessionsetnls_date_format='dd-mm-yy';
对时间的限制
begin
sys.dbms_logmnr.start_logmnr(dictfilename=>'dictionary.ora',starttime=>to_date('01-May-201300:00:00','DD-MON-YYYYHH:MI:SS'),
endtime=>to_date('02-May-201300:00:00','DD-MON-YYYY HH:MI:SS'));
end;
对SCN字段的限制
begin
sys.dbms_logmnr.start_logmnr(dictfilename=>'dictionary.ora',startscn=>100,endscn=>500);
end;
分析结束后,所分析到的数据可以从一个名为V$LOGMNR_CONTENTS的视图中查询到。V$LOGMNR_CONTENTS的全部字段的解释如博客地址所示:
http://shuimomo.blog.51cto.com/1141396/867150
2.5实例分析
Oracle10g及以上的版本想要捕获数据库的DML操作,必须打开数据补全。只有执行这条语句之后的DML操作才会被捕获
alter database addsupplemental log data;
oracle9.2版本以后数据补全是默认关闭的,所以9.2以后的版本默认情况下是不能分析DML语句,只能分析出DDL语句,但oracle9i和8i能分析所有的数据。
如查找从student表中从01-May-201300:00:00到02-May-201300:00:00时间段内所有的删除操作。
SELECT sql_redo FROMv$logmnr_contents where seg_name='student' and upper(operation)='delete';
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。 最后,execute dbms_logmnr.end_logmnr 终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
三、备注
如何在Oracle 8 数据库中使用LogMiner
Logminer是Oracle8i 才提供的工具,但如果你还有一个数据库是Oracle8 的,能否使用呢?回答是可以的。经过笔者试验,只要在Oracle8数据库中建立DBMS_LOGMNR_D 这个package, 就可以使用logminer. 察看Oracle 8i 可以知道,在$ORACLE_HOME/rdbms /admin 下面有一个名为dbmslmd.sql的script,这正是产生dbms_logmnr_d这个package的script.因此,只要拷贝一个8i的dbmslmd.sql,然后用sys用户在Oracle 8 数据库中执行后,就可以像本文第一部分那样使用logminer 了。
如何用logminer 分析另一个Oracle数据库所产生的归档日志文件
可能有两台Oracle数据库,一台配置了logminer,另一台没有。或者另一台数据库暂时不能访问,但可以取到它的归档日志文件,能否对这些文件进行分析呢?可以,但要求比较苛刻。首先必修二者运行的平台(platform)相同,而且必须另一台数据库事先曾创建过字典文件,而且在创建后字符集没有过变化。满足条件的话,把另一台数据库要分析的归档日志文件和它的字典文件一起拷贝过来,就可以分析。当然这两台数据库都必须至少是8以上的版本。