• Oracle Logminer 查找日志信息


    转:http://blog.csdn.net/tianlesoftware/archive/2010/05/19/5604497.aspx

    Logminer是oracle从8i开始提供的用于分析重做日志信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D两个package,后边的D是字典的意思。它既能分析redo log file,也能分析归档后的archive log file。在分析日志的过程中需要使用数据字典,一般先生成数据字典文件后使用,10g以后的版本还可以使用在线数据字典。

    Logminer可以分析其它数据库的重做日志文件,但是必须使用重做日志所在数据库的数据字典,否则会出现无法识别的乱码。另外被分析数据库的操作系统平台最好和当前Logminer所在数据库的运行平台一样,且block size相同。


    LogMiner用于分析重做日志和归档日志所记载的事务操作。


    一、确定数据库的逻辑损坏时间。假定某个用户执行drop table误删除了重要表sales,通过LogMiner可以准确定位该误操作的执行时间和SCN值,然后通过基于时间恢复或者基于SCN恢复可以完全恢复该表数据。


    二、确定事务级要执行的精细逻辑恢复操作。假定某些用户在某表上执行了一系列DML操作并提交了事务,并且其中某个用户的DML操作存在错误。通过LogMiner可以取得任何用户的DML操作及相应的UNDO操作,通过执行UNDO操作可以取消用户的错误操作。
    三、执行后续审计。通过LogMiner可以跟踪Oracle数据库的所有DML、DDL和DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息。


    1、LogMiner基本对象
     源数据库(source database):该数据库是指包含了要分析重做日志和归档日志的产品数据库。
      分析数据库(mining database):该数据库是指执行LogMiner操作所要使用的数据库。        
      LogMiner字典:LogMiner字典用于将内部对象ID号和数据类型转换为对象名和外部数据格式。使用LogMiner分析重做日志和归档日志时,应该生成LogMiner字典,否则将无法读懂分析结果。

    2、LogMiner配置要求
    (1)源数据库和分析数据库(源数据库和分析数据库可以是同一个数据库)
    源数据库和分析数据库必须运行在相同硬件平台上;
    分析数据库可以是独立数据库或源数据库;
    分析数据库的版本不能低于源数据库的版本;
    分析数据库与源数据库必须具有相同的字符集。

    (2)LogMiner字典:LogMiner字典必须在源数据库中生成。

    (3)重做日志文件
    当分析多个重做日志和归档日志时,它们必须是同一个源数据库的重做日志和归档日志;
    当分析多个重做日志和归档日志时,它们必须具有相同的resetlogs  scn;
    当分析的重做日志和归档日志必须在Oracle8.0版本以上。

    3、补充日志(suppplemental logging)
    重做日志用于实现例程恢复和介质恢复,这些操作所需要的数据被自动记录在重做日志中。但是,重做应用可能还需要记载其他列信息到重做日志中,记录其他列的日志过程被称为补充日志。

    默认情况下,Oracle数据库没有提供任何补充日志,从而导致默认情况下LogMiner无法支持以下特征:
    索引簇、链行和迁移行;
    直接路径插入;
    摘取LogMiner字典到重做日志;
    跟踪DDL;
    生成键列的SQL_REDO和SQL_UNDO信息;
    LONG和LOB数据类型。

    因此,为了充分利用LogMiner提供的特征,必须激活补充日志。在数据库级激活补充日志的示例如下:
    SQL> conn /as sysdba
    已连接。
    SQL> alter database add supplemental log data;
    数据库已更改。

    注意:这激活不用重启数据库,数据库联机即可。


    4、LogMiner支持的数据类型和表存储属性

    char、nchar、varchar2、varchar、nvarchar2;
    number;
    date、timestamp、timestamp with time zone、timestamp with local time zone;
    interval year to month、interval day to second;
    raw;
    clob、nclob、blob;
    long、long raw;
    binary_float、binary_double;
    函数索引;
    没有lob列的索引组织表(IOT)。

    5、LogMiner不支持的数据类型和表存储属性
    bfile;
    抽象数据类型;
    集合类型(嵌套表和varray);
    参照对象;
    xmltype;
    具有LOB列的索引组织表;
    使用compress特征的表。

    提供LogMiner字典有3种选项:

    1、使用源数据库数据字典(Online Catalog)
    使用源数据库分析重做日志或归档日志时,如果要分析表的结构没有发生任何变化,Oracle建议使用该选项分析重做日志和归档日志。为了使LogMiner使用当前数据库的数据字典,启动LogMiner时应执行如下操作:
    SQL> execute dbms_logmnr.start_logmnr (options=>dbms_logmnr.dict_from_online_catalog);

    需要注意,dbms_logmnr.dict_from_online_catalog要求数据库必须处于open状态,并且该选项只能用于跟踪DML操作,而不能用于跟踪DDL操作。(本人一般用这种查DML操作)

    2、摘取LogMiner字典到重做日志
    使用分析数据库分析重做日志或归档日志,或者被分析表的结构发生改变时,Oracle建议使用该选项分析重做日志和归档日志。为了摘取LogMiner字典到重做日志,要求源数据库必须处于archivelog模式,并且该数据库处于open状态。示例如下:
    SQL> execute dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
    (本人比较少用这种方式)

    3、摘取LogMiner字典到字典文件
    字典文件用于存放对象ID号和对象名信息,该选项是为了与早期版本兼容而保留的。需要注意,使用字典文件分析重做日志时,如果要分析新建的对象。必须重新建立字典文件。如下所示:
    SQL> execute dbms_logmnr_d.build ('dict.ora','d:\demo',dbms_logmnr_d.store_in_flat_file);

    (本人一般用这种方式来查DDL的操作记录,如数据库没有配置utl_file_dir参数,需要配置后需要重启数据库)

    下面使用源数据库数据字典(Online Catalog)来分析DML操作

    1、先进行DML和DDL的操作,以便下面分析。
    SQL> conn /as sysdba
    已连接。
    SQL> show parameter utl;
    NAME                                 TYPE        VALUE                         
    ------------------------------------ ----------- --------
    create_stored_outlines               string                                    
    utl_file_dir                         string   
    SQL> insert into scott.dept  values('80','Dave','AnQing');
    已创建 1 行。
    SQL> update scott.dept set loc='shang hai' where deptno=70;
    已更新 1 行。
    SQL> commit;
    提交完成。
    SQL> delete from scott.dept where deptno=40;
    已删除 1 行。
    SQL> commit;
    提交完成。
    SQL> alter table scott.dept add(phone varchar2(32));
    表已更改。
    SQL> insert into scott.dept values(50,'David','Dai','13888888888');
    已创建 1 行。
    SQL> commit;
    提交完成。
    SQL> alter table scott.dept add(address varchar2(300));
    表已更改。

    2、把在线重做日志变成归档日志,这样分析归档日志就可以了
    SQL> alter system switch logfile;
    系统已更改。

    3、建立日志分析列表:

    ----填加要分析的日志文件
    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);
    PL/SQL 过程已成功完成。
    ---继续填加,用dbms_logmnr.removefile可以删除
    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);
    PL/SQL 过程已成功完成。

    4、启动LogMiner
    SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
    PL/SQL 过程已成功完成。

    5、查看日志分析结果:
    SQL> col username format a8
    SQL> col sql_redo format a50
    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    会话已更改。

    SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='DEPT';
    USERNAME        SCN TIMESTAMP           SQL_REDO
    -------- ---------- ------------------- -----------------------------------
                1645927 2009-08-25 16:54:56 delete from "SCOTT"."DEPT" where "DEPTNO" = '40' and "DNAME" = 'OPERATIONS' and "LOC" = 'BOSTON' and "PHONE" IS NULL and "ADDRESS" IS       NULL and ROWID = 'AAAMfNAAEAAAAAQAAD';
    SYS         1645931 2009-08-25 16:54:57 alter table scott.dept add(phone varchar2(32)) ;
    SYS         1645992 2009-08-25 16:56:33 alter table scott.dept add(address varchar2(300)) ;

    6、结束LogMiner
    SQL> execute dbms_logmnr.end_logmnr;
    PL/SQL 过程已成功完成。

    ---------------------------------------------------------------------------------

    用摘取LogMiner字典到字典文件分析DDL操作:

    1、进行DDL操作,以便分析
    SQL> conn scott/admin
    已连接。
    SQL> drop table emp;
    表已删除。
    SQL> drop table dept;
    表已删除。
    SQL> conn /as sysdba
    已连接。
    SQL> alter system switch logfile;
    系统已更改。

    2、使用字典文件,请查看数据库是否配置utl_file_dir,这个参数为字典文件的目录。配置该参数后,需要重启数据库
    SQL> show user;
    USER 为 "SYS"
    SQL> show parameter utl;
    NAME                                 TYPE        VALUE                         
    ------------------------------------ ----------- ------------
    create_stored_outlines               string                                    
    utl_file_dir                         string                          
    SQL> alter system set utl_file_dir='D:\oracle\logminer' scope=spfile;
    System altered.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    SQL> show parameter utl
    NAME                                 TYPE        VALUE                         
    ------------------------------------ ----------- -----------
    create_stored_outlines               string                                    
    utl_file_dir                         string      D:\oracle\logminer     

    3、建立字典文件:
    SQL> execute dbms_logmnr_d.build ('dict.ora','D:\oracle\logminer',dbms_logmnr_d.store_in_flat_file);
    PL/SQL 过程已成功完成。

    4、建立日志分析列表:
    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);
    PL/SQL 过程已成功完成。

    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);
    PL/SQL 过程已成功完成。

    5、启动LogMiner
    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\logminer\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
    PL/SQL 过程已成功完成。

    6、查询分析日志结果:

    SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents  where lower(sql_redo) like '%table%';
    USERNAME        SCN TIMESTAMP      SQL_REDO
    -------- ---------- -------------- -----------------------------------
                1647538 25-8月 -09     ALTER TABLE "SCOTT"."EMP" RENAME CONSTRAINT "PK_EMP" TO "BIN$f/mFjN+nTmaYjrb17YU80w==$0" ;
                1647550 25-8月 -09     ALTER TABLE "SCOTT"."EMP" RENAME TO "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
                1647553 25-8月 -09     drop table emp AS "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
                1647565 25-8月 -09     ALTER TABLE "SCOTT"."DEPT" RENAME CONSTRAINT "PK_DEPT" TO "BIN$3imFL+/1SqONFCB7LoPcCg==$0" ;
                1647571 25-8月 -09     ALTER TABLE "SCOTT"."DEPT" RENAME TO "BIN$kYKBLvltRb+vYaT6RkaRiA==$0";
                1647574 25-8月 -09     drop table dept AS "BIN$kYKBLvltRb+vYaT6RkaRiA==$0" ;                        
                                                 
    或者其他的查询:

    SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where username='SYS';
    USERNAME TIMESTAMP           SQL_REDO                                          
    -------- ------------------- --------------------------------------------------
    USERNAME        SCN TIMESTAMP      SQL_REDO
    -------- ---------- -------------- -----------------------------------
    SYS         1647487 25-8月 -09     set transaction read write;
    SYS         1647488 25-8月 -09     alter user scott account unlock;
    SYS         1647490 25-8月 -09     Unsupported
    SYS         1647492 25-8月 -09     commit;
                             
    7、结束LogMiner
    SQL> execute dbms_logmnr.end_logmnr;
    PL/SQL 过程已成功完成。

    注意,v$logmnr_contents内容保存了日志的内容,只在当前会话有效,如果想长期保存分析,可以在当前会话用create table tablename as select * from v$logmnr_contents语句来持久保存。


    其他操作:


    1.生成数据字典文件
    SQL> show parameter utl_file_dir
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    utl_file_dir                         string      *
    SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dict20090625.dat',dictionary_location => '/orabak');
    PL/SQL procedure successfully completed.

    2.可以先设置使用的表空间
    SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('erp') 
    PL/SQL procedure successfully completed.

    3.开始分析日志
    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/orabak/dict20090625.dat');
    PL/SQL procedure successfully completed.

    提取特定时间的日志:
    dbms_logmnr.start_logmnr(dictfilename=>'/orabak/dict20090625.dat',
    starttime=>to_date('2009-06-24 09:30:00','YYYY-MM-DD HH24:MI:SS'),
    endtime=>to_date('2009-06-24 12:00:59','YYYY-MM-DD HH24:MI:SS'))

  • 相关阅读:
    腾讯// 反转字符串
    腾讯//Multiply Strings 字符串相乘
    腾讯//盛最多水的容器
    腾讯//删除排序数组中的重复项
    腾讯//删除排序数组中的重复项
    C语言中的预处理命令
    Python十大应用领域与就业方向
    Python的主要应用领域及应用场景
    Git命令_git status
    Git命令_git add快速添加文件到暂存区
  • 原文地址:https://www.cnblogs.com/weixun/p/2976505.html
Copyright © 2020-2023  润新知