详解Oracle的日志的工具——LogMiner

  前言
  Oracle的重做日志分为两种,联机重做日志文件(online Redo log)和归档重做日志(Archive Redo log )文件;本文主要归档重做日志(Archive Redo log )文件,在线日志在分析方法上相似。
  由于各种因素,Oracle的重做日志(redo log)文件无法通过各种文本软件直接读取,而Oracle自带的LogMiner是分析日志最优选择。
LogMiner: Oracle自8i后提供的,通过SQL命令形式来查询和解析redo(重做)和undo(撤销)日志的工具。

1.安装LogMiner--简单 
  LogMiner是Oracle自带的日志解析工具,安装时只要运行sql脚本即可,安装一次就ok。

首先运行下面这样两个脚本,这两个脚本必须均以SYS用户身份运行。
其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

  两个文件的位置:
  1  $ORACLE_HOME/rdbms/admin/dbmslm.sql
  2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql.
 
  操作命令:
  SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslm.sql
  程序包已创建。
   授权成功。

  SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslmd.sql
  程序包已创建。

2.创建数据字典(data-dictionary)--根据实际情况选择
  数据字典用来解析日志中的十六进制的数据项(如日志中的sql语句的列名称)。

  3种可选的方式,创建供LogMiner访问数据字典。
  1)直接访问数据库中在线的数据字典。
    这种方式简单,方便,但是由于数据字典是当前最新的,可能不匹配过去的log中的信息。      
    使用方法:在启动logMiner进行分析的时候,使用DICT_FROM_ONLINE_CATALOG选项。如下所示:
  SQL> EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
  最好以sys sysdba身份登录执行该命令。
    
  2)将数据字典导出为一个文件。
    这种方式是将某个时间点的数据字典导出为文件;在logMiner启动分析的时候(见第四步)通过options参数指定该文件的名称和路径,以解析日志。
  如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外,在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
  使用方法:
  a. 首先调整spfile参数;  
  b. 然后创建数据字典文件;
     SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename =>'logmn_ora817.dat',dictionary_location => ' D:Oraclelogs ');
    # 注意,dictionary_location必须和UTL_FILE_DIR参数所指的目录相同。    

   3)将数据字典导出到log文件中。
      要将数据库字典信息提取到重做日志文件,数据库必须处于ARCHIVELOG 模式。
     导出时,使用STORE_IN_REDO_LOGS 选项。例如:
      SQL> EXECUTE DBMS_LOGMNR_D.BUILD (
          SQLPLUS>options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

3、创建要分析的日志文件列表---日志绝对路径
   参数logfilename的值是日志文件的绝对路径(字符串)。

   A.添加日志文件
     SQL>execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00013_0736960501.001');
   B.继续添加。。。
     SQL>execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00014_0736960501.001');
     继续添加。。。
     SQL> execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00015_0736960501.001');
     也可以删除(不常用)
     SQL> execute dbms_logmnr.add_logfile(options=>dbms_logmnr.removefile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00015_0736960501.001');
需要分析日志文件的个数完全由调用者决定。
  另外,Oracle提供归档日志视图(v$archived_log),通过select * from v$archived_log可查询已存档日志文件的信息(绝对路径、存档时间等);(需要DBA权限登录)
有关v$archived_log视图的详细信息请参考Oracle官方文档:http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_1016.htm

4.启动LogMiner进行分析--关键

(1)无限制条件
SQL> EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG); 

(2)有限制条件
    调用者通过对dbms_logmnr.start_logmnr命令的时间(包含StartTime和EndTime)参数和SCN参数(包含StartScn和EndScn)进行设置,可对日志进行按意愿筛选。

   时间范围(使用较多):对dbms_logmnr.start_logmnr命令使用StartTime和EndTime参数。
   SCN(语句顺序编号)范围:对dbms_logmnr.start_logmnr命令使用StartScn和EndScn参数。

   例如,假如想仅仅分析2010-12-07的日志(当然,上一步添加的日志文件需要包含该时间范围,不然会报错):
   SQL> EXECUTE dbms_logmnr.start_logmnr( StartTime => to_date('2010-12-07 00:00:00','YYYY-MM-DD HH24:MI:SS'), EndTime => to_date('2010-12-08 23:59:59','YYYY-MM-DD HH24:MI:SS'),options
=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

假如想仅仅分析某个SCN范围内的日志:
SQL> EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG, StartScn => 20, EndScn => 50);

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         系统调试参数,实际很少使用

该步骤涉及数据字典的使用方法的选择:
a) 使用导出的文本文件数据字典。
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName=>' D:Oraclelogslogmn_ora817.dat ');

b)直接使用在线的数据字典。
EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

c)使用导出到log文件中的数据字典。
EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_REDO_LOGS);


5、查看日志分析的结果--关键

动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息,通过Select XX from        v$logmnr_contents可以查询。
  例如:

select SQL_REDO,to_char(TIMESTAMP,'YYYY-MM-DD HH24:MI:SS'),to_char(COMMIT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') from v$logmnr_contents


  SQL> select sql_redo from v$logmnr_contents

  a、查看DML操作,示例:
     SELECT operation,sql_redo,sql_undo FROM V$logmnr_contents
     WHERE operation IN ('INSERT','UPDATE','DELETE') and seg_name = 'QIUYB';
   
     OPERATION     SQL_REDO                    SQL_UNDO
     ----------    --------------------------  --------------------------
     INSERT        inser into qiuyb.qiuyb ...  delete from qiuyb.qiuyb...
 
    operation--操作类型。
    sql_redo--记录已执行的SQL脚本,
    sql_undo--用于恢复所做的操作的,与sql_redo相反的SQL脚本。   

    以上三个字段是比较关键的字段,v$logmnr_contents视图的更多属性字段可查询Oracle官方文档(11g)。http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_1154.htm
 
  b、查看DDL操作,示例:
    SELECT timstamp,sql_redo
    FROM v$logmnr_contents WHERE operation IN ('DDL') ;
   
  所有的LogMiner的分析过程存储都在PGA内存中,视图v$logmnr_contents是基于dbms_logmrn.start_logmnr会话的。随着进程的结束,会话结束后,视图v$logmnr_content也随之消失。 

6.结束LogMiner的分析,结束本次logMiner会话。--简单
     DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,所有的LogMiner的分析过程消失,分析结果也随之不再存在。

  SQL>BEGIN
   2     dbms_logmnr.end_logmnr;
   3   end;
   4 /


7.注意事项
    在利用LogMiner日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装LogMiner的数据库实例的redo logs文件。

  使用LogMiner 分析其他数据库实例时,有几点需要注意:
  1).LogMiner必须使用被分析数据库实例产生的字典文件(第二步创建数据字典的第二种方式),而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。

  2). 被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle 8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft NT上运行LogMiner。当然两者的硬件条件不一定要求完全一样。

  3). LogMiner日志分析工具仅能够分析Oracle 8i以后的产品,对于8i以前的产品,该工具也无能为力。

  4).LogMiner日志分析工具仅的数据字典的方式选择比较重要,根据实际的情况而慎重选择。
  5).LogMiner日志分析过程有些繁琐,涉及数据库的知识点较多,需要耐心调试。

你可能感兴趣的:(oracle,sql,SQL Server,unix,脚本)