oracle 日志挖掘

oracle 提供了一种技术,叫做LogMiner 可以对redo log和archive log进行挖掘,得到其中有用的信息。该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner的使用
  使用LogMiner数据库必须运行在归档模式下,查看数据归档的如下:

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     1607
下一个存档日志序列   1609
当前日志序列           1609

在开始学习LogMiner,我们做如下的例子:
SQL> create table t as select * from dba_objects;
得到当前scn
SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
   7240047
我们来做删除操作
SQL> delete from t where rownum=1;

SQL> commit;

再一次得到scn
SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
   7240098
得到当前日志
SQL> select group#,members,status from v$log;

    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          1 CURRENT
         2          1 INACTIVE
         3          1 INACTIVE
SQL> select member from v$logfile where group#=1;

MEMBER
--------------------------------------------------

D:\APP\ZHOUKAI\ORADATA\ORCL\REDO01.LOG
后面我们使用LogMiner来挖掘这部分日志
1.安装LogMiner
  在安装oracle的时候,一般都已经默认安装了LogMiner了,查看有没有LogMiner运行所需要的dbms_logmnrdbms_logmnr_d,如果没有则需要安装,在oracle 11g中使用dba权限执行以下脚本:

1、$ORACLE_HOME/rdbms/admin/dbmslm.sql

2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql

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

2.创建字典文件

 CREATE DIRECTORY utlfile AS 'D:\app\zhoukai\oradata\LOGMNR';
 alter system set utl_file_dir='D:\app\zhoukai\oradata\LOGMNR' scope=spfile;

 执行以上语句后,重启数据库,查看是否设置成功

SQL> show parameter utl

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
create_stored_outlines               string
utl_file_dir                         string      D:\app\zhoukai\oradata\LOGMNR
 
    
EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location=>'D:\app\zhoukai\oradata\LOGMNR');

3.添加分析文件

 方法如下:

 
    
exec dbms_logmnr.add_logfile(logfilename=>'D:\APP\ZHOUKAI\ORADATA\ORCL\REDO01.LOG',options=>dbms_logmnr.NEW);

也可以添加多个文件,我们新增一个文件,方法如下:看出不同了吗,看看最后红色部分
 
    
dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE)

4.启动日志分析

  在分析日志之前我们要重建数据字典,因为我们刚才对表做了改动,所以在启动之前我们先要更新数据字典。
  
  启动日志可以制定一个范围,也可以不指定分析整个文件,具体的一些参数请查看oracle官方文档,在这边我们使用scn的范围限制。方法如下:
  
  EXECUTE dbms_logmnr.start_logmnr( DictFileName =>'D:\app\zhoukai\oradata\LOGMNR\dictionary.ora',StartScn =>7240047,EndScn =>7240098); 
 如果你不想创建字典可以使用以下方法
 EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG,StartScn =>7240047,EndScn =>7240098);  
 具体options有很多参数,可以参照oracle官方文档。

5.查看分析结果
 到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。

SELECT sql_redo FROM v$logmnr_contents; 

如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户LOGMINER对表EMP所作的一切工作。

SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP'; 

序号

名称

含义

1

SCN

特定数据变化的系统更改号

2

TIMESTAM

数据改变发生的时间

3

COMMIT_TIMESTAMP

数据改变提交的时间

4

SEG_OWNER

数据发生改变的段名称

5

SEG_NAME

段的所有者名称

6

SEG_TYPE

数据发生改变的段类型

7

SEG_TYPE_NAME

数据发生改变的段类型名称

8

TABLE_SPACE

变化段的表空间

9

ROW_ID

特定数据变化行的ID

10

SESSION_INFO

数据发生变化时用户进程信息

11

OPERATION

重做记录中记录的操作(如INSERT)

12

SQL_REDO

可以为重做记录重做指定行变化的SQL语句(正向操作)

13

SQL_UNDO

可以为重做记录回退或恢复指定行变化的SQL语句(反向操作)

需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。

最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。

那么我们来产看我们挖掘的数据。


SQL> SELECT operation,sql_redo,sql_undo FROM v$logmnr_contents WHERE  table_name

='T';


OPERATION       SQL_REDO                       SQL_UNDO

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

DELETE          delete from "SCOTT"."T" where  insert into "SCOTT"."T"("OWNER

                "OWNER" = 'SYS' and "OBJECT_NA ","OBJECT_NAME","SUBOBJECT_NAM

                ME" = 'ICOL$' and "SUBOBJECT_N E","OBJECT_ID","DATA_OBJECT_ID

                AME" IS NULL and "OBJECT_ID" = ","OBJECT_TYPE","CREATED","LAS

                 '20' and "DATA_OBJECT_ID" = ' T_DDL_TIME","TIMESTAMP","STATU

                2' and "OBJECT_TYPE" = 'TABLE' S","TEMPORARY","GENERATED","SE

                 and "CREATED" = TO_DATE('30-3 CONDARY","NAMESPACE","EDITION_

                月 -10', 'DD-MON-RR') and "LAS NAME") values ('SYS','ICOL$',N

                T_DDL_TIME" = TO_DATE('30-3月  ULL,'20','2','TABLE',TO_DATE('

                -10', 'DD-MON-RR') and "TIMEST 30-3月 -10', 'DD-MON-RR'),TO_D

                AMP" = '2010-03-30:10:07:48' a ATE('30-3月 -10', 'DD-MON-RR')


OPERATION       SQL_REDO                       SQL_UNDO

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

                nd "STATUS" = 'VALID' and "TEM ,'2010-03-30:10:07:48','VALID'

                PORARY" = 'N' and "GENERATED"  ,'N','N','N','1',NULL);

                = 'N' and "SECONDARY" = 'N' an

                d "NAMESPACE" = '1' and "EDITI

                ON_NAME" IS NULL and ROWID = '

                AAAUswAAEAABbujAAA';

我们可以使用undo恢复误删除的数据,其它作用前面已经描述了。

6.结束LogMiner
SQL> EXEC DBMS_LOGMNR.END_LOGMNR;

PL/SQL 过程已成功完成。

关于LogMiner学习如上

参照文档:oracle官方文档
http://www.cnblogs.com/shishanyuan/p/3140440.html


 
    

你可能感兴趣的:(oracle学习,oracle,日志挖掘,LogMiner)