• 使用Logminer工具分析DML和DDL操作


    LogMiner是Oracle数据库提供的一个工具,它用于分析重做日志和归档日志所记载的事务操作。
    一、确定数据库的逻辑损坏时间。假定某个用户执行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> conn scott/mzl
    已连接。

    SQL> insert into dept
      2  values(80,'meng','PanJan');

    已创建 1 行。

    SQL> update dept set loc='shang hai' where deptno=70;

    已更新 1 行。

    SQL> commit;

    提交完成。

    SQL> delete from dept where deptno=40;

    已删除 1 行。

    SQL> commit;

    提交完成。

    SQL> alter table dept add(phone varchar2(32));

    表已更改。

    SQL> conn mzl/mzl
    已连接。
    SQL> insert into dept
      2  values(70,'Hello','guangzhou');

    已创建 1 行。

    SQL> commit
      2  ;

    提交完成。

    SQL> insert into scott.dept
      2  values(50,'Xiao','XiangGuang','138138000');

    已创建 1 行。

    SQL> commit;

    提交完成。

    SQL> alter table scott.dept add(address varchar2(300));

    表已更改。

    2、把在线重做日志变成归档日志,这样分析归档日志就可以了

    SQL> alter system switch logfile;

    系统已更改。


    3、建立日志分析列表:
    SQL> conn /as sysdba
    已连接。
    SQL> execute dbms_logmnr.add_logfile(-
    > logfilename=>'D:oracleproduct10.2.0

    flash_recovery_areaORCLARCHIVELOG2008_10_23

    O1_MF_1_41_4HZPW700_.ARC',options=>dbms_logmnr.new);

    PL/SQL 过程已成功完成。

    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:oracleproduct10.2.0

    flash_recovery_areaORCLARCHIVELOG2008_10_23

    O1_MF_1_40_4HZKMGPY_.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、查看日志分析结果:

    (也可以创建一个表来存放v$logmnr_contents,这样便于以后查询,

    create table logminer_test   tablespace   test_space

    as 

    select   *   from   v$logmnr_contents ;

    请着一个比较空闲的表空间,因为表v$logmnr_contents的数据量很大

    把表的权限赋予给其他的用户,这样方便mzl用户使用第三方工具查询(plsql等):

    grant  select  on  logminer_test   to  mzl;)


    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,timestamp,sql_redo from v$logmnr_contents where

    seg_name='DEPT';

    USERNAME TIMESTAMP           SQL_REDO                                           
    -------- ------------------- -------------------------------------------------- 
    MZL      2008-10-23 10:02:22 insert into "SCOTT"."DEPT"("COL 1","COL 2","COL 3" 
                                 ,"COL 4") values (HEXTORAW('c133'),HEXTORAW('58696 
                                 16f'),HEXTORAW('5869616e674775616e67'),HEXTORAW('3 
                                 13338313338303030'));                              
                                                                                   

    USERNAME TIMESTAMP           SQL_REDO                                           
    -------- ------------------- -------------------------------------------------- 
    MZL      2008-10-23 10:03:20 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/mzl
    已连接。
    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:demo' scope=spfile;

    系统已更改。

    SQL>shutdown immediate;
    SQL>startup;
    或者强制性重启数据库
    SQL> startup force;
    ORACLE 例程已经启动。

    Total System Global Area  289406976 bytes                                       
    Fixed Size                  1248576 bytes                                       
    Variable Size              75498176 bytes                                       
    Database Buffers          205520896 bytes                                       
    Redo Buffers                7139328 bytes                                       
    数据库装载完毕。
    数据库已经打开。
    SQL> show parameter utl

    NAME                                 TYPE        VALUE                          
    ------------------------------------ ----------- -----------
    create_stored_outlines               string                                     
    utl_file_dir                         string      d:demo     


    3、建立字典文件:
    SQL> execute dbms_logmnr_d.build

    ('dict.ora','d:demo',dbms_logmnr_d.store_in_flat_file);

    PL/SQL 过程已成功完成。


    4、建立日志分析列表:
    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:oracleproduct10.2.0

    flash_recovery_areaORCLARCHIVELOG2008_10_23

    O1_MF_1_42_4HZRHJQX_.ARC',options=>dbms_logmnr.new);

    PL/SQL 过程已成功完成。

    SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:oracleproduct10.2.0

    flash_recovery_areaORCLARCHIVELOG2008_10_23

    O1_MF_1_41_4HZPW700_.ARC',options=>dbms_logmnr.addfile);

    PL/SQL 过程已成功完成。


    5、启动LogMiner
    SQL> execute dbms_logmnr.start_logmnr

    (dictfilename=>'d:demodict.ora',options=>dbms_logmnr.ddl_dict_tracking);

    PL/SQL 过程已成功完成。

    6、查询分析日志结果:
    SQL> select username,timestamp,sql_redo from v$logmnr_contents
      2  where lower(sql_redo) like '%table%';

    USERNAME TIMESTAMP           SQL_REDO                                           
    -------- ------------------- -------------------------------------------------- 
    SCOTT    2008-10-23 09:59:29 alter table dept add(phone varchar2(32));          
    SCOTT    2008-10-23 10:29:50 drop table emp AS "BIN$j3Z4SzJ3QS6l/AGiD5RJiA==$0" 
                                  ;                                                 
                                                                                    
    SCOTT    2008-10-23 10:30:05 ALTER TABLE "SCOTT"."DEPT" RENAME TO "BIN$u6gL7Khf 
                                 TZC+67ipacjOHw==$0" ;                              
                                                                                    
    SCOTT    2008-10-23 10:30:05 drop table dept AS "BIN$u6gL7KhfTZC+67ipacjOHw==$0 
                                 " ;                                               

    或者其他的查询:
    SQL> select username,timestamp,sql_redo from v$logmnr_contents
      2  where username='SCOTT';

    USERNAME TIMESTAMP           SQL_REDO                                           
    -------- ------------------- -------------------------------------------------- 
    SCOTT    2008-10-23 09:55:49 set transaction read write;                        
    SCOTT    2008-10-23 09:55:49 insert into "UNKNOWN"."OBJ# 53917"("COL 1","COL 2" 
                                 ,"COL 3") values (HEXTORAW('c151'),HEXTORAW('6d656 
                                 e67'),HEXTORAW('50616e4a616e'));                   
                                                                                    
    SCOTT    2008-10-23 09:56:25 update "UNKNOWN"."OBJ# 53917" set "COL 3" = HEXTOR 
                                 AW('7368616e6720686169') where "COL 3" = HEXTORAW( 
                                 '6265696a696e67') and ROWID = 'AAANKdAAEAAAANEAAA' 
                                 ;                                                  
                                                                                    
    SCOTT    2008-10-23 09:56:33 commit;                                           

    SCOTT    2008-10-23 09:59:29 alter table dept add(phone varchar2(32));   
    SCOTT    2008-10-23 10:29:50 drop table emp AS "BIN$j3Z4SzJ3QS6l/AGiD5RJiA==$0" 
                                  ;      

    SCOTT    2008-10-23 10:30:05 drop table dept AS "BIN$u6gL7KhfTZC+67ipacjOHw==$0 
                                 " ;                                               

    7、结束LogMiner
    SQL> execute dbms_logmnr.end_logmnr;

    PL/SQL 过程已成功完成。

    用Logminer能够获得一些更进一步信息,根据Log中的删除时间,结合listener.log日志登陆时间,基本可以确定是who从where登陆的数据库,能查到人的。(listener.log位于$oracle_home etworklog目录中)

  • 相关阅读:
    day 49
    day 48
    day 46
    IOC和DI到底是什么?
    堆排序算法
    快速排序算法
    java中try-catch-finally中的return语句
    归并排序算法
    选择排序算法
    冒泡排序算法
  • 原文地址:https://www.cnblogs.com/chinajsks/p/3527781.html
Copyright © 2020-2023  润新知