zoukankan      html  css  js  c++  java
  • [Oracle]LogMiner工具小结

    (一)LogMiner工具的作用
    Logminer工具主要用来分析redo log和archive log文件。通过该工具,可以轻松获得Oracle redo log和archive log文件的具体内容,甚至,可以获得用户对数据库进行的DDL、DML操作。另外还可分析得到一些需要回滚的sql语句。该工具特别适合调试、审计以及回退某个特定的对象。Logminer的作用总结如下:
    1.跟踪数据库的变化,可以离线跟踪数据的变化,而不会影响在线的性能;
    2.回退数据库的变化,回退特定的变化的数据,减少point-in-time recovery的执行 ;
    3.确定事物级要执行的精细逻辑恢复操作,通过查询log,取得需要的undo语句;
    4.审计,查看具体用户对数据库做的具体操作。

    注意:
    1.LogMiner不支持IOT表、Long、LOB及集合类型;

    (二)如何使用
    (1)安装LogMiner
    通常在安装数据库后就已经安装了Logminer,要查看数据库是否安装了LogMiner,只需查看数据库中是否已经有了dbms_logmnr和dbms_logmnr_d这2个package,如果有了,则已经安装,如果没有,执行下面两个脚本即可:

    $ORACLE_HOME/rdbms/admin/dbmslm.sql
    $ORACLE_HOME/rdbms/admin/dbmslmd.sql

    需要注意,两个脚本须用DBA用户身份运行。第1个脚本用来创建dbms_logmnr包,该包用来分析日志文件,第2个脚本用来创建dbms_logmnr_d包,该包用来创建数据字典文件。

    创建完成后数据库中将多出4个procedure和3个view,具体如下:
    1. dbms_logmnr_d.build :创建一个数据字典文件;
    2. dbms_logmnr.add_logfile :添加日志文件以供分析;
    3. dbms_logmnr.start_logmnr :开始分析日志文件;
    4. dbms_logmnr.end_logmnr :结束分析日志文件;

    1.v$logmnr_dictionary :显示字典文件的信息;
    2.logmnr_logs :在LogMiner启动时显示要分析的日志列表;
    3.logmnr_contents :Logminer启动后,可以使用该view查看日志文件的内容。
    需要注意,这里的view是session相关,其它session是查看不到的,仅仅可以在当前session中查看。

    (2)如果要分析归档数据,需要数据库需处于归档模式下,通过如下命令查看归档模式

    SQL> archive log list;
    数据库日志模式            存档模式
    自动存档             启用
    存档终点            /home/app/oracle/oradata/orcl/arch_log
    最早的联机日志序列     46
    下一个存档日志序列   49
    当前日志序列           49

    (3)创建数据字典之前需要修改spfile参数utl_executefile_dir,由于是静态参数需要重启数据库

    SQL> create directory utlfile as '/home/oracle/logmnr';
     
    Directory created
    
    SQL> alter system set utl_executefile_dir = '/home/oracle/logmnr' scope=spfile;

    (4)生成数据字典文件(可选)
    在使用LogMiner工具之前,可以使用dbms_logmnr_d.build创建一个数据字典文件,创建该文件的目的是将数据字典导出为一个文本文件,该文件是可选的,但是如果没有该文件,LogMiner解释出的关于数据字典中的部分,如表名、列名、元数据将会以16进制的形式展现,我们是无法理解的。
    需要注意的是,如果我们要分析的数据库中的表发生了变化,影响到数据字典信息也发生了变化,那么我们在进行分析时,就需要重新生成数据字典文件。
    创建数据字典文件需要以dba身份进行,创建到上面建好的logmnr文件中

    begin
    dbms_logmnr_d.build(dictionary_filename=>'dict.ora',
    dictionary_location=>'/home/oracle/logmnr',
    options=>dbms_logmnr_d.store_in_flat_file);
    end;
    /

    (5)加入需要分析的日志文件
    LogMiner可以对重做日志文件(redo log)和归档日志文件(archive log)进行分析,加入要分析的日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用参数dbms_logmnr.NEW参数,后面的文件使用dbms_logmnr.ADDFILE参数。
    step1:创建列表,添加第1个文件:

    BEGIN
      dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_49_936489730.dbf',options=>dbms_logmnr.NEW);
    END;
    /

    step2:添加其它文件到列表

    BEGIN
      dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_50_936489730.dbf',options=>dbms_logmnr.ADDFILE);
      dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE);
    END;
    /

    (6)使用Logminer文件进行分析

    LogMiner分析日志文件可以设置限制条件,也可不设置限制条件,不设置限制条件会对加载的全部日志文件进行分析,设置了限制条件,只会对符合条件的日志进行分析。

    (6.1)不限制条件

    EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora');

    (6.2)有限制条件

    通过对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     varchar()                                数据字典文件的位置

    (7)观察分析结果
    通过第(6)步,我们已经得到了重做日志文件的内容,通过动态数据字典v$logmnr_contents可以查看到所有的信息。

    select * from v$logmnr_contents;

    v$logmnr_contents的部分栏位信息:

    栏位                                          解释
    ---------------------------          ------------------------------------

    SCN                                          查询的特定数据的SCN号
    TIMESTAM                                 数据改变发生的时间
    COMMIT_TIMESTAMP                  数据改变提交的时间
    SEG_OWNER                             数据发生改变的段名称
    SEG_NAME                                段的所有者的名称
    SEG_TYPE                                 数据发生改变的段类型
    SEG_TYPE_NAME                       数据发生改变的段类型名称
    TABLE_SPACE                           变化段的表空间
    ROW_ID                                   数据变化行的ID
    SESSION_INFO                          数据发生变化时会话信息
    OPERATION                               日志中记录的操作
    SQL_REDO                               日志中记录的指定行变化的SQL语句(正向操作)
    SQL_UNDO                               为重做日志记录回退或恢复制定行变化的SQL语句

    (三)一次LogMiner使用测试

    (1)查看归档,下一个归档log是53

    SQL> archive log list
    Database log mode           Archive Mode
    Automatic archival           Enabled
    Archive destination           /home/app/oracle/oradata/orcl/arch_log
    Oldest online log sequence     50
    Next log sequence to archive   53
    Current log sequence           53

    (2)查看数据字典存放位置

    SQL> show parameter utl_file_dir
    
    NAME            TYPE        VALUE
    -------------   --------    -----------------------
    utl_file_dir    string      /home/oracle/LOGMNR

    (3)创建一张测试用的表

    SQL> create table test06 
      2  (
      3  id number,
      4  name varchar(15)
      5  );
     
    Table created
     
    SQL> insert into test06 values(1,'lijiaman');
     
    1 row inserted
     
    SQL> insert into test06 values(2,'wangyujie');
     
    1 row inserted

    (4)将redo归档

    SQL> alter system switch logfile;
     
    System altered

    (5)查看归档情况

    SQL> archive log list
    Database log mode           Archive Mode
    Automatic archival           Enabled
    Archive destination           /home/app/oracle/oradata/orcl/arch_log
    Oldest online log sequence     50
    Next log sequence to archive   53
    Current log sequence           53
    SQL> archive log list;
    Database log mode           Archive Mode
    Automatic archival           Enabled
    Archive destination           /home/app/oracle/oradata/orcl/arch_log
    Oldest online log sequence     51
    Next log sequence to archive   54
    Current log sequence           54

    (6)创建数据字典文件

    begin
    dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora',
    dictionary_location=>'/home/oracle/LOGMNR',
    options=>dbms_logmnr_d.store_in_flat_file);
    end;
    /

    (7)添加要分析的归档日志文件
    (7.1)先到OS上找到归档文件:

    [oracle@localhost LOGMNR]$ cd /home/app/oracle/oradata/orcl/arch_log
    [oracle@localhost arch_log]$ ls
    1_49_936489730.dbf  1_50_936489730.dbf  1_51_936489730.dbf  1_52_936489730.dbf  1_53_936489730.dbf

    (7.2)创建归档日志文件列表

    SQL> begin
      2  dbms_logmnr.add_logfile(LogFileName => '/home/app/oracle/oradata/orcl/arch_log/1_53_936489730.dbf',Options => dbms_logmnr.new);
      3  end;
      4  /
     
    PL/SQL procedure successfully completed

    (7.3)如果不确定待分析的数据是否在上面添加的归档日志文件中,可以多添加几个

    BEGIN
      dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE);
      dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_52_936489730.dbf',options=>dbms_logmnr.ADDFILE);
    END;
    /
    
    PL/SQL procedure successfully completed

    (8)开始分析

    SQL> EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/LOGMNR/dictionary.ora');
     
    PL/SQL procedure successfully completed

    (9)查看结果

    SQL> select c.timestamp,c.operation,c.table_space,c.sql_redo,c.sql_undo  from v$logmnr_contents c where c.seg_owner='LIJIAMAN';                                                                         
                                                                                                                                                                                                            
    TIMESTAMP   OPERATION   TABLE_SPACE   SQL_REDO                                                                         SQL_UNDO                                                                         
    ----------- ----------- ------------- ----------------------------------------------------------------------   --------------------------------------------------------------------------------         
    2017/4/25 2 DDL                                                                                                                                                                                         
                                          create table test06                                                                                                                                               
                                          (                                                                                                                                                                 
                                          id number,                                                                                                                                                        
                                          name varchar(15)                                                                                                                                                  
                                          )                                                                                                                                                                 
                                          ;                                                                                                                                                                 
                                                                                                                                                                                                            
    2017/4/25 2 INSERT      USERS         insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('1','lijiaman');     delete from "LIJIAMAN"."TEST06" where "ID" = '1' and "NAME" = 'lijiaman' and ROW        
    2017/4/25 2 INSERT      USERS         insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('2','wangyujie');    delete from "LIJIAMAN"."TEST06" where "ID" = '2' and "NAME" = 'wangyujie' and RO
  • 相关阅读:
    51nod 1113 矩阵快速幂 如题目
    poj Raising Modulo Numbers 快速幂模板(取膜)
    bzoj 1503: [NOI2004]郁闷的出纳员 平衡树
    codevs 1063 合并果子 优先队列相关
    bzoj 3224: Tyvj 1728 普通平衡树 Treap模版
    快排模板
    hdu 4353 统计点在三角形内的个数
    hdu 3264 圆的交+二分
    hdu 3685 多边形重心+凸包
    hdu 3992 AC自动机上的高斯消元求期望
  • 原文地址:https://www.cnblogs.com/lijiaman/p/6765730.html
Copyright © 2011-2022 走看看