1、LogMiner简介

   LogMiner工具实际上是由两个PL/SQL内建包((DBMS_LOGMNR 和DBMS_LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动LogMiner时创建)组成。
   LOGMINER安装包包括3个文件:DBMSLM.SQL,DBMSLMD.SQL,PRVTLM.PLB,prvtlmd.plb
    如果LOGMINER有问题,把这4个文件都运行一遍,PLB文件的运行方式同SQL文件。
    安装LogMiner工具,要运行两个脚本,这两个脚本必须均以SYS管理员身份运行。
$ORACLE_HOME/rdbms/admin/dbmslm.sql   #用来创建DBMS_LOGMNR包,该包用来分析日志文件。
$ORACLE_HOME/rdbms/admin/dbmslmd.sql  #用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

2.  创建LogMiner所需的数据字典文件
   LogMiner分析日志文件时,需要参考数据库的数据字典。如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是16进制的形式,我们是无法直接理解的。例如,下面的sql语句:
 INSERTINTOdm_dj_swry (rydm,rymc) valueS (00005, '张三');
LogMiner解释出来的结果将是下面这个样子,
 insertintoObject#308(col#1,col#2)
  values (hextoraw('c30rte567e436'),hextoraw('4a6f686e20446f65'));
    所以,创建数据字典的目的就是让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。
    有3种可选的方式,供LogMiner访问数据字典。
1)直接访问数据库中在线的数据字典。
    这种方式简单,方便,但是由于数据字典是当前最新的,可能不匹配过去的log中的信息。
在启动logMiner进行分析的时候,使用DICT_FROM_ONLINE_CATALOG选项。
EXECUTEdbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
2)将数据字典导出为一个文本文件。
     数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来创建。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外一种情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
    首先在初始化参数文件(pfile或者spfile)中,添加参数UTL_FILE_DIR,对于LogMiner来说,该参数值为服务器中放置数据字典文件的目录。如:UTL_FILE_DIR = (D:Oraclelogs)
重新启动数据库,使新加的参数生效,然后创建数据字典文件:
SQL>EXECUTEdbms_logmnr_d.build(
dictionary_filename => 'logmn_ora817.dat',
dictionary_location => 'D:Oraclelogs ');  # 注意,一定要指定这个参数,而且必须和UTL_FILE_DIR参数所指的目录相同。
    创建数据字典是让LogMiner引用涉及到内部数据字典中的部分时使用对象的名称,而不是系统内部的16进制的ID。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,就需要重新创建该字典。
3)将数据字典导出到log文件中。
    要将数据库字典信息提取到重做日志文件,数据库必须处于ARCHIVELOG 模式。
导出时,使用STORE_IN_REDO_LOGS 选项。例如:
SQLPLUS>EXECUTEDBMS_LOGMNR_D.BUILD (
SQLPLUS>options =>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
2005年4月13日,看到这里。/oracle/oracle9i/oradata/Test01/logMiner_ora920.dat离线数据字典文件已经导出。
3.  添加要分析的日志文件

Logminer可以用来分析在线的重做日志文件和归档日志文件,但是我们一般建议使用归档的日志文件。

a.添加新的日志文件:
SQL>EXECUTEdbms_logmnr.add_logfile(
LogFileName=>'D:databaseoracleoradataora817archiveARC01491.001 ',Options=>dbms_logmnr.new);
b.添加另外的日志文件到列表
SQL>EXECUTEdbms_logmnr.add_logfile(
LogFileName=>'D:databaseoracleoradataora817archiveARC01491.002',Options=>dbms_logmnr.addfile);
关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。
c. 移去一个日志文件
SQL>EXECUTEdbms_logmnr.add_logfile(
LogFileName=>'D:databaseoracleoradataora817archiveARC01491.002',Options=>dbms_logmnr.REMOVEFILE);
创建了要分析的日志文件,就可以对其进行分析。
4.  开始日志分析
无限制条件:
a)使用导出的文本文件数据字典。
SQL>EXECUTEdbms_logmnr.start_logmnr(
DictFileName=>'D:Oraclelogslogmn_ora817.dat '); #有时会出现日期错误。
b)直接使用在线的数据字典。
EXECUTEdbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
c)使用导出到log文件中的数据字典。
EXECUTEdbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_REDO_LOGS);
可以使用相应的限制条件:
时间范围:对dbms_logmnr.start_logmnr使用StartTime和EndTime参数
SCN范围:对dbms_logmnr.start_logmnr使用StartScn和EndScn参数
     通过对过程DBMS_LOGMNR.START_LOGMNR中几个不同参数的设置,可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2001年9月18日的日志,:
SQL>EXECUTEdbms_logmnr.start_logmnr(DictFileName => 'e:oraclelogsv816dict.ora ',StartTime =>to_date('2001-9-1800:00:00','YYYY-MM-DDHH24:MI:SS') ,EndTime =>to_date(''2001-9-1823:59:59','YYYY-MM-DDHH24:MI:SS '));
也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
SQL>EXECUTEdbms_logmnr.start_logmnr(DictFileName => 'e:oraclelogsv816dict.ora ',StartScn =>20,EndScn =>50);
5. 查看分析结果
v$logmnr_logs视图??用来做什么?
在v$logmner_contents视图中查看分析结果。
SQL_REDOVARCHAR2(4000)
SQL_UNDOVARCHAR2(4000)
这两个字段很关键,你如果想重做就执行sql_redo的SQL,
如果想undo可以执行sql_undo的SQL。
例如:
selectoperation,sql_redo,sql_undofromv$logmnr_contents
WHEREusername='DB_ZGXT'ANDtablename='SB_DJJL';
OPERATION SQL_REDO                                                                        SQL_UNDO
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INSERT    insertinto "QUEST"."QUEST_IX_BKG_EVENT_SNAP"("INSTANCE_ID","SNAPSHOT_TIME","TOTdeletefrom "QUEST"."QUEST_IX_BKG_EVENT_SNAP"where "INSTANCE_ID" = '121'and "S
INSERT    insertinto "QUEST"."QUEST_IX_BKG_EVENT_SNAP"("INSTANCE_ID","SNAPSHOT_TIME","TOTdeletefrom "QUEST"."QUEST_IX_BKG_EVENT_SNAP"where "INSTANCE_ID" = '121'and "S
通过手工执行SQL_UNDO,恢复所作的操作
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程(会话)是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
6.  其它注意事项 
我们可以利用LogMiner日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装LogMiner的数据库实例的redologs文件。使用LogMiner分析其他数据库实例时,有几点需要注意:
1).LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。
2).  被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle& nbsp8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft& nbspNT上运行LogMiner。当然两者的硬件条件不一定要求完全一样。
3).LogMiner日志分析工具仅能够分析Oracle8以后的产品,对于8以前的产品,该工具也无能为力。
7.  所有相关数据字典视图
V$LOGMNR_CALLBACK             SynonymforV_$LOGMNR_CALLBACK
V$LOGMNR_CONTENTS             SynonymforV_$LOGMNR_CONTENTS
V$LOGMNR_DICTIONARY           SynonymforV_$LOGMNR_DICTIONARY
V$LOGMNR_LOGFILE              SynonymforV_$LOGMNR_LOGFILE
V$LOGMNR_LOGS                 SynonymforV_$LOGMNR_LOGS
V$LOGMNR_PARAMETERS           SynonymforV_$LOGMNR_PARAMETERS
V$LOGMNR_PROCESS              SynonymforV_$LOGMNR_PROCESS
V$LOGMNR_REGION               SynonymforV_$LOGMNR_REGION
V$LOGMNR_SESSION              SynonymforV_$LOGMNR_SESSION
V$LOGMNR_STATS                SynonymforV_$LOGMNR_STATS
V$LOGMNR_TRANSACTION          SynonymforV_$LOGMNR_TRANSACTION