Oracle logminer 使用总结


一、logminer的用途日志文件中存放着所有进行数据库恢复的数据,记录了针对数据库结构的每一个变化,也就是对数据库操作的所有DML语句。logminer 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重作日志文件。总的说来,logminer工具的主要用途有:
 1.跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。
 2. 回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。

 3.优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。

二、安装logminer
要安装logminer工具,必须首先要运行下面这样两个脚本:
 l. $Oracle_HOME/rdbms/admin/dbmslm.sql
 2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql
这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

  1. SQL> @?/rdbms/admin/dbmslm.sql  
  2.   
  3. 程序包已创建。  
  4.   
  5. 授权成功。  
  6.   
  7. 同义词已创建。  
  8.   
  9. SQL> @?/rdbms/admin/dbmslmd.sql  
  10.   
  11. 程序包已创建。  
  12.   
  13. 同义词已创建。  
  14.   
  15. SQL> show user  
  16. USER 为 "SYS"  
三、使用logminer工具
下面将详细介绍如何使用logminer工具。
 1、创建数据字典文件(data-dictionary)
前面已经谈到,logminer工具实际上是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动logminer时创建)组成。在使用logminer工具分析redo log文件之前,必须使用DBMS_LOGMNR_D 包将数据字典导出为一个文本文件。该字典文件是可选的,但是如果没有它,logminer解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是16进制的形式,我们是无法直接理解的。

例如,下面的sql语句: INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '张三');

logminer解释出来的结果将是下面这个样子, insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));

创建数据字典的目的就是让logminer引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来创建。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外一种情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。首先指定数据字典文件的位置,也就是添加一个参数UTL_FILE_DIR,该参数值为服务器中放置数据字典文件的目录。重新启动数据库,使新加的参数生效,然后创建数据字典文件。

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> show parameter utl_file_dir  
  4.   
  5. NAME                                 TYPE        VALUE  
  6. ------------------------------------ ----------- ------------------------------   
  7. utl_file_dir                         string  
  8.   
  9. SQL> alter system set utl_file_dir='/u01/app/logminer' scope=spfile;  
  10.   
  11. 系统已更改。  
  12.   
  13. SQL> shutdown immediate  
  14. 数据库已经关闭。  
  15. 已经卸载数据库。  
  16. ORACLE 例程已经关闭。  
  17. SQL> startup  
  18. ORACLE 例程已经启动。  
  19.   
  20. Total System Global Area  238530560 bytes  
  21. Fixed Size                  1335724 bytes  
  22. Variable Size             150998612 bytes  
  23. Database Buffers           83886080 bytes  
  24. Redo Buffers                2310144 bytes  
  25. 数据库装载完毕。  
  26. 数据库已经打开。  
  27. SQL> show parameter utl_file_dir  
  28.   
  29. NAME                                 TYPE        VALUE  
  30. ------------------------------------ ----------- ------------------------------   
  31. utl_file_dir                         string      /u01/app/logminer  
  32. SQL> exec dbms_logmnr_d.build( 'dictionary.ora''/u01/app/logminer');  
  33.   
  34. PL/SQL 过程已成功完成。  

   开始之前

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;  
  4.   
  5. SUPPLEME  
  6. --------   
  7. NO  
  8.   
  9. SQL> alter database add supplemental log data;  
  10.   
  11. 数据库已更改。  
  12.   
  13. SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;  
  14.   
  15. SUPPLEME  
  16. --------   
  17. YES  
supplemental logging(扩充日志):在通常情况下,redo log 只记录的进行恢复所必需的信息,但是这些信息对于我们使用redo log进行一些其他应用时是不够的,例如在 redo log中使用rowid唯一标识一行而不是通过Primary key,如果我们在另外的数据库分析这些日志并想重新执行某些dml时就可能会有问题,因为不同的数据库其rowid代表的内容是不同的。在这时候就需要一些额外的信息(columns)加入redo log,这就是supplemental logging。supplemental logging分为两个级别database_level and table_level,其中database_level级别分为两种,minimal supplemental logging and identification key logging,其中minimal supplemental logging不会显著增加系统的负担,但是identification key logging对系统负担比较大,在默认情况下oracle不会设置任何supplemental logging,但是如果要使用logminer,oracle建议至少设置minimal supplemental logging。我在使用logminer是,不设置minimal supplemental logging,从v$logmnr_contents中几乎得不到任何信息。


    2、创建要分析的日志文件列表
Oracle的重作日志分为两种,在线(online)和离线(offline)归档日志文件,下面就分别来讨论这两种不同日志文件的列表创建。
 (1)分析在线重作日志文件
  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> select * from v$log;  
  4.   
  5.     GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME  
  6. ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------   
  7.          1          1         67   52428800        512          1 YES INACTIVE                643449 14-12月-11           653614 15-12月-11  
  8.          2          1         68   52428800        512          1 NO  CURRENT                 653614 15-12月-11       2.8147E+14  
  9.          3          1         66   52428800        512          1 YES INACTIVE                614556 13-12月-11           643449 14-12月-11  
  10.   
  11. SQL> select * from v$logfile;  
  12.   
  13.     GROUP# STATUS  TYPE    MEMBER                                                       IS_  
  14. ---------- ------- ------- ------------------------------------------------------------ ---   
  15.          1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                      NO  
  16.          2         ONLINE  /u01/app/oracle/oradata/orcl/redo02.log                      NO  
  17.          3         ONLINE  /u01/app/oracle/oradata/orcl/redo03.log                      NO  
  18.   
  19. SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log', dbms_logmnr.new);  
  20.   
  21. PL/SQL 过程已成功完成。  
  22.   
  23. SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log', dbms_logmnr.addfile);  
  24.   
  25. PL/SQL 过程已成功完成。  
  26.   
  27. SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log', dbms_logmnr.addfile);  
  28.   
  29. PL/SQL 过程已成功完成。  

删除列表中的日志文件:exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log', dbms_logmnr.removefile);
关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。

  • 1
  • 2
  • 3
  • 下一页

相关内容