Home  >  Article  >  Database  >  oracle 日志挖掘

oracle 日志挖掘

WBOY
WBOYOriginal
2016-06-07 15:36:581129browse

1、$ORACLE_HOME/rdbms/admin/dbmslm.sql 2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql 这两个脚本必须均以DBA用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。 2.创

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

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

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

2.创建字典文件

<span><span></span><span>CREATE</span><span> DIRECTORY utlfile </span><span>AS</span><span><span>'<span><span>D:\app\zhoukai\oradata\LOGMNR</span></span><span>'</span></span><span>;</span></span><span>alter</span><span> system </span><span>set</span><span> utl_file_dir</span><span>=</span><span><span>'</span><span>D:\app\zhoukai\oradata\LOGMNR</span><span>'</span></span><span> scope</span><span>=</span><span>spfile;</span></span>
<span></span><pre class="brush:php;toolbar:false"><span> 执行以上语句后,重启数据库,查看是否设置成功</span>
<span></span>
<span><span><span>SQL> show parameter utl

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
create_stored_outlines               string
</span><span>utl_file_dir                         string      D:\app\zhoukai\oradata\LOGMNR</span></span></span>
<pre class="brush:php;toolbar:false"><span><span>EXECUTE</span><span> dbms_logmnr_d.build(dictionary_filename </span><span>=></span><span>'</span><span>dictionary.ora</span><span>'</span><span>, dictionary_location</span><span>=></span><span>'</span><span><span><span>D:\app\zhoukai\oradata\LOGMNR</span></span></span><span>'</span><span>);</span></span>
<span>3.添加分析文件</span>
<span> 方法如下:</span>
<pre class="brush:php;toolbar:false"><span><span><span>exec dbms_logmnr.add_logfile(logfilename</span></span><span>=></span><span><span>'D:\APP\ZHOUKAI\ORADATA\ORCL\REDO01.LOG</span><span>'</span></span><span><span>,options</span></span><span>=></span><span>dbms_logmnr.NEW);</span></span>
<span></span>
<span><span>也可以添加多个文件,我们新增一个文件,方法如下:看出不同了吗,看看最后红色部分</span></span>
<pre class="brush:php;toolbar:false"><span><span>dbms_logmnr.add_logfile(logfilename</span><span>=></span><span>'</span><span>D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001</span><span>'</span><span>,options</span><span>=></span><span><span>dbms_logmnr.ADDFILE</span></span><span>)</span></span>
<span></span>
<span><span>4.启动日志分析</span></span>
<span></span>
<span>  在分析日志之前我们要重建数据字典,因为我们刚才对表做了改动,所以在启动之前我们先要更新数据字典。</span>
<span>  启动日志可以制定一个范围,也可以不指定分析整个文件,具体的一些参数请查看oracle官方文档,在这边我们使用scn的范围限制。方法如下:</span>
<span><span><span>EXECUTE dbms_logmnr.start_logmnr( DictFileName =>'D:\app\zhoukai\oradata\LOGMNR\dictionary.ora',StartScn =>7240047,EndScn =>7240098); </span></span></span>
<span><span> 如果你不想创建字典可以使用以下方法</span></span>
<span><span> EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG,StartScn =>7240047,EndScn =>7240098);  </span></span>
<span><span> 具体options有很多参数,可以参照oracle官方文档。</span></span>
<span>5.查看分析结果</span>
<span><span> <span>到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。</span></span></span>

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





Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn