现在的位置: 首页 > 综合 > 正文

使用oracle的logmnr分析工具

2013年10月28日 ⁄ 综合 ⁄ 共 5925字 ⁄ 字号 评论关闭

1.安装logminer:

      要安装LogMiner工具,必须首先要运行下面这样两个脚本,

      @F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\dbmslm.sql

      @F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\dbmslmd.sql.

      这两个脚本必须均以SYS用户身份运行。

2 创建数据字典文件
首先在init.ora初始化参数文件中,添加参数UTL_FILE_DIR,该参数值为服务器中放置数据

字典文件的目录。如:
utl_file_dir=F:\hisrun

[SYS@orcl] SQL>execute dbms_logmnr_d.build('showdict.ora','F:\hisrun');
BEGIN dbms_logmnr_d.build('showdict.ora','F:\hisrun'); END;

*
第 1 行出现错误:
ORA-01308: 未设置初始化参数 utl_file_dir
ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 3474
ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 3552
ORA-06512: 在 "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: 在 line 1


[SYS@orcl] SQL>show parameter utl_file;

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
utl_file_dir                         string

[SYS@orcl] SQL>show parameter utl;

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines               string

utl_file_dir                         string

[SYS@orcl] SQL>show user;
USER 为 "SYS"
[SYS@orcl] SQL>alter system set utl_file_dir='F:\hisrun' scope=spfile;

系统已更改。

[SYS@orcl] SQL>show parameter utl

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines               string

utl_file_dir                         string

[SYS@orcl] SQL>shutdown abort
ORACLE 例程已经关闭。
[SYS@orcl] SQL>startup
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             218106756 bytes
Database Buffers          385875968 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
数据库已经打开。

[SYS@orcl] SQL>show parameter utl;

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines               string

utl_file_dir                         string
F:\hisrun
[SYS@orcl] SQL>execute dbms_logmnr_d.build('showdict.ora','F:\hisrun');

20100122补充:SQL> execute dbms_logmnr_d.build(dictionary_filename=>'showdict.ora',dictionary_l
ocation=>'F:\hisrun');

PL/SQL 过程已成功完成。

3 将要分析的日志文件加入要分析的log list中,察看有哪些日志文件可以用select * from v$logfile;查询已经加入那些可以用select * from v$logmnr_logs(注:查询必须在同一个会话中查询,单独开查询将查不到)语句如下:

execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
',dbms_logmnr.new);

[SYS@orcl] SQL>select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG

[SYS@orcl] SQL>execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG',dbms_logmnr.new);

PL/SQL 过程已成功完成。

再增加一个:

[SYS@orcl] SQL>execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG',dbms_logmnr.addfile);

如果需要从分析列表里去掉一个文件用

('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG',dbms_logmnr.removefile);

20100122补充:

   (1)分析在线重作日志文件

        如上所示

     (2)分析离线日志文件

SQL> EXECUTE dbms_logmnr.add_logfile( 
LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09108.001', 
Options=>dbms_logmnr.new);

4 更改会话时间表达方式(注一定要在本会话下修改,我开始发生错误就是因为在别的会话里修改的,如果允许,可以将数据库默认的时间表达方式修改掉)会话内修改为alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 系统设置在注册表。

5 查询分析的日志文件包含的scn范围和日期范围。

  select low_time,high_time,low_scn,next_scn from v$logmnr_logs;会列出你加入的日志文件的以上信息。

6 使用LogMiner进行日志分析
     
      SQL>execute dbms_logmnr.start_logmnr(DictFileName=>'F:\hisrun\showdict.ora',options=>dbms_logmnr.committed_data_only,startscn=>116295629,endscn=>116685026);

20100122补充:

(1)无限制条件

SQL> EXECUTE dbms_logmnr.start_logmnr( 
DictFileName=>' e:\oracle\logs\ v816dict.ora ');

(2)有限制条件

通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2001年9月18日的日志,:

SQL> EXECUTE dbms_logmnr.start_logmnr( 
DictFileName => ' e:\oracle\logs\ v816dict.ora ', 
StartTime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS') 
EndTime => to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));

  也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:

SQL> EXECUTE dbms_logmnr.start_logmnr( 
DictFileName => ' e:\oracle\logs\ v816dict.ora ', 
StartScn => 20, 
EndScn => 50);

7 观察分析结果(LogMiner的分析结果是放在v$logmnr_contents中)

       A.SQL> select sql_redo from v$logmnr_contents where upper(sql_redo) like '%DELETE%;

              在视图v$logmnr_contents中查找真实被删除的记录。
       
       B.SQL> SELECT timeseg_name,sql_redo FROM v$logmnr_contents WHERE seg_name='MS_CF01' and sql_redo like '%DELETE%';
              
              功能同A。

       C.SQL> select sql_undo from v$logmnr_contents where seg_name='MS_CF01' and sql_redo like '%delete%' and rownum<10;

       D.SQL> select sql_undo from v$logmnr_contents where seg_name='MS_CF01' and upper(OPERATION)='DELETE';

              针对SQL_REDO重做记录重做指定行变化的SQL语句,所对应的反操作就是重做记录回退或恢复指定行变化的SQL语句。
        select timestamp,sql_undo,sql_redo from v$logmnr_contents where seg_name='MS_CF01'

20100122补充:

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

8 结束分析,清空v$logmnr_contents

      SQL>execute dbms_logmnr.end_logmnr (结束会话,会自清除分析记录)

9 下面将就视图v$logmnr_contents的常用字段含义进行说明:

其中operation指的是操作,sql_redo指的是实际的操作,sql_undo指的是用于取消的相反的操作)

         名称                    含义
        ----------------------- -------- --------------------------------------------
         SCN                    特定数据变化的系统更改号
         TIMESTAMP              数据改变发生的时间
         COMMIT_TIMESTAMP       数据改变提交的时间
         SEG_OWNER              数据发生改变的段名称
         SEG_NAME               段的所有者名称
         SEG_TYPE               数据发生改变的段类型
         SEG_TYPE_NAME          数据发生改变的段类型名称
         TABLE_SPACE            变化段的表空间
         ROW_ID                 特定数据变化行的ID
         SESSION_INFO           数据发生变化时用户进程信息
         OPERATION              重做记录中记录的操作(如INSERT)
         SQL_REDO               可以为重做记录重做指定行变化的SQL语句(正向操作)
         SQL_UNDO               可以为重做记录回退或恢复指定行变化的SQL语句(反向操作)

      注:SQL_REDO 列显示的是所做的操作(SQL 语句),SQL_UNDO 列显示的是要恢复该操作所需要的SQL语句

          只要顺序执行SQL_UNDO的内容,就可以恢复到修改前的数据。

抱歉!评论已关闭.