ITPub博客

首页 > Linux操作系统 > Linux操作系统 > LogMiner

LogMiner

原创 Linux操作系统 作者:ylw66 时间:2009-08-19 15:44:29 0 删除 编辑

LogMiner最好的文档:Using LogMiner to Analyze Redo Logs

Oracle 9.2 Database Administrator's Guide的第9

 LogMiner是以Redo log Dictionary为基础的

LogMiner使用数据字典将内部的对象标识和数据类型,如果没有数据字典,LogMiner返回的是16进制的数据和ID

 LogMiner三种方式生成数据字典(该数据字典是LogMiner运行的基础,是LogMiner工具必须关联的一种辅助资源)

1 Extracting the Dictionary to a Flat File

解析数据字典到物理文件(LogMiner使用时关联的物理文件)

步骤如下:

 (1)设置参数:UTL_FILE_DIR,数据字典物理文件存放的路径,

alter system set utl_file_dir = 'd:\oracle\ora92\database' scope = spfile

    该参数必须要在数据库重新启动后才能生效

    如果设置的路径无法访问,那在dbms_logmnr_d.build时会报错

  (2) 如果是8i,拷贝dbmslmd.sql脚本

 (3)如果数据库没有打开,mount并打开数据库

 (4)如果是8i,执行dbmslmd.sql脚本

 (5)执行存储过程 dbms_logmnr_d.build

 dbms_logmnr_d.build('dictionary,ora','d:\oracle\ora92\database')

  事实上关键的步骤只是15步,关键中的关键就是dictionary的存放的路径

必须保证首先路径存在并能访问,其次UTL_FILE_DIR中的路径和build方法中传入的路径相同,否则就会报如下错误

SQL> execute dbms_logmnr_d.build('dictionary.ora','d:\oracle\ora92\logmnr');

BEGIN dbms_logmnr_d.build('dictionary.ora','d:\oracle\ora92\logmnr'); END;

 *

ERROR 位于第 1 :

ORA-01336: 无法打开指定的字典文件

ORA-29280: 目录路径无效

ORA-06512: "SYS.DBMS_LOGMNR_D", line 920

ORA-06512: "SYS.DBMS_LOGMNR_D", line 1938

ORA-06512: line 1

 2 Extracting a Dictionary to the Redo Logs

     解析数据字典到重做日志中

     使用这种方式,必须保证数据库打开并在归档模式下,并且archiving被激活。在解析到重做日志的过程中,所有的DDL语句都不能执行,

     所以这种方式能保证数据字典的快照与当前的数据字典一致,如果解析到物理文件,这点是不能保证的

          步骤:

execute

dbms_logmnr_d.build(OPTIONS=>dbms_logmnr_d.STORE_IN_REDO_LOGS);

           可以通过下面的sql来确认redo log中包含了数据字典的信息

           SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';

           SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';

            由于该方式需要很多时间,所以最好在非高峰时间运行

 3 Using the Online Catalog

      使用联机字典

      步骤:

             SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -

  2 DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

             联机字典包括最新的数据库的信息,是最快的分析重做日志的方法。但是如果表被改动,联机字典只反映最近的表格的版本,如果重做日志中包含以前该表格版本的SQLlogmnr将没办法解析,只会显示16进制的数据

       注意两点:

       联机字典需要数据库打开

       联机字典方式DDL_DICT_TRACKING的选项是失效的

关于DDL_DICT_TRACKING

LogMiner的内部字典是根据源数据字典(物理文件,重做日志中的字典或联机字典)来构建的,如果使用了该选项,LogMiner将重做日志中DDL的修改应用到内部字典上

DDL tracking默认是非激活的,激活方式:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -

  2 DBMS_LOGMNR.DDL_DICT_TRACKING);

  查询DDL语句

SQL> SELECT USERNAME, SQL_REDO

  2 FROM V$LOGMNR_CONTENTS

  3 WHERE USERNAME = 'SYS' AND EPRATION = 'DDL';

  注意两点:

  如果使用联机字典方式,DDL_DICT_TRACKING是失效的

  DDL_DICT_TRACKING需要数据打开

关于补充日志

http://space.itpub.net/7607759/viewspace-462640

    文章非常好,只能理解大概的意思,以后再研究

LogMiner常用步骤:

1  Perform. Initial Setup Activities ---初始设置

   激活补充日志

    SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA

    使用下面的语句LogMiner使用logmnrts$表空间来存放所有的LogMiner表。LogMiner默认存放表在System表空间

    the following statement will re-create all LogMiner tables to use the logmnrts$ tablespace:

   SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');

2 Extract a Dictionary (unless you plan to use the online catalog)---提供一个字典源

3 Specify Redo Logs for Analysis

   加入待分析的重做日志

   开始加入时使用OPTIONS => DBMS_LOGMNR.NEW

   SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -

  2 LOGFILENAME => '/oracle/logs/log1.f', -

  3 PTIONS => DBMS_LOGMNR.NEW);

   可以再添加

  SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -

  2 LOGFILENAME => '/oracle/logs/log2.f', -

  3 PTIONS => DBMS_LOGMNR.ADDFILE);

   可以再删除

  SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -

  2 LOGFILENAME => '/oracle/logs/log2.f', -

  3 PTIONS => DBMS_LOGMNR.REMOVEFILE);

4 Start a LogMiner Session

  指明字典物理文件

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -

  2 DICTFILENAME =>'/oracle/database/dictionary.ora');

   按时间来过滤

  SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -

  2 DICTFILENAME => '/oracle/dictionary.ora', -

  3 STARTTIME => TO_DATE('01-Jan-1998 08:30:00', 'DD-MON-YYYY HH:MI:SS'), -

  4 ENDTIME => TO_DATE('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));

   SCN来过滤

  SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -

  2 DICTFILENAME => '/oracle/dictionary.ora', -

  3 STARTSCN => 100, -

  4 ENDSCN => 150);

 只显示Commit的数据

         SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -

  2 DBMS_LOGMNR.COMMITTED_DATA_ONLY);

   跳过崩溃的重做日志

  SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -

  2 DBMS_LOGMNR.SKIP_CORRUPTION);

 5 Query V$LOGMNR_CONTENTS

查询V$LOGMNR_CONTENTS

 6 End a LogMiner Session

释放资源

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;

 

******使用Logmnr来分析Table Hits

 SELECT SEG_OWNER, SEG_NAME, COUNT(*) AS Hits FROM

  V$LOGMNR_CONTENTS WHERE SEG_NAME NOT LIKE '%$' GROUP BY

  SEG_OWNER, SEG_NAME;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22111412/viewspace-612686/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-29

  • 博文量
    57
  • 访问量
    94465