Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690601
  • 博文数量: 176
  • 博客积分: 4791
  • 博客等级: 上校
  • 技术积分: 1921
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:47
个人简介

it江湖漂,怎能不挨刀;一朝机器当,看你怎么着!

文章分类

全部博文(176)

文章存档

2014年(2)

2012年(17)

2011年(27)

2010年(18)

2009年(6)

2008年(21)

2007年(43)

2006年(42)

分类: LINUX

2007-04-09 14:04:03

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语句:
  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进制。
    有3种可选的方式,供LogMiner访问数据字典。
1)直接访问数据库中在线的数据字典。
    这种方式简单,方便,但是由于数据字典是当前最新的,可能不匹配过去的log中的信息。
在启动logMiner进行分析的时候,使用DICT_FROM_ONLINE_CATALOG选项。
EXECUTE dbms_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> EXECUTE dbms_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>EXECUTE DBMS_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> EXECUTE dbms_logmnr.add_logfile(
LogFileName=>' D:databaseoracleoradataora817archiveARC01491.001 ', Options=>dbms_logmnr.new);

b.添加另外的日志文件到列表
SQL> EXECUTE dbms_logmnr.add_logfile(
LogFileName=>' D:databaseoracleoradataora817archiveARC01491.002', Options=>dbms_logmnr.addfile);
关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。

c. 移去一个日志文件
SQL> EXECUTE dbms_logmnr.add_logfile(
LogFileName=>' D:databaseoracleoradataora817archiveARC01491.002', Options=>dbms_logmnr. REMOVEFILE);

创建了要分析的日志文件,就可以对其进行分析。

4.  开始日志分析
无限制条件:
a)使用导出的文本文件数据字典。
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName=>' D:Oraclelogslogmn_ora817.dat '); #有时会出现日期错误。
b)直接使用在线的数据字典。
EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
c)使用导出到log文件中的数据字典。
EXECUTE dbms_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> EXECUTE dbms_logmnr.start_logmnr( DictFileName => ' e:oraclelogsv816dict.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:oraclelogsv816dict.ora ', StartScn => 20, EndScn => 50);

5. 查看分析结果
v$logmnr_logs视图??用来做什么?
在v$logmner_contents视图中查看分析结果。
SQL_REDO VARCHAR2(4000)
SQL_UNDO VARCHAR2(4000)
这两个字段很关键,你如果想重做就执行sql_redo的SQL,
如果想undo可以执行sql_undo的SQL。

例如:
select operation,sql_redo,sql_undo from v$logmnr_contents
WHERE username='DB_ZGXT' AND tablename='SB_DJJL';

OPERATION  SQL_REDO                                                                         SQL_UNDO
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
INSERT     insert into "QUEST"."QUEST_IX_BKG_EVENT_SNAP"("INSTANCE_ID","SNAPSHOT_TIME","TOT delete from "QUEST"."QUEST_IX_BKG_EVENT_SNAP" where "INSTANCE_ID" = '121' and "S
INSERT     insert into "QUEST"."QUEST_IX_BKG_EVENT_SNAP"("INSTANCE_ID","SNAPSHOT_TIME","TOT delete from "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的数据库实例的redo logs文件。使用LogMiner分析其他数据库实例时,有几点需要注意:

1). LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。

2). 被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle 8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft NT上运行LogMiner。当然两者的硬件条件不一定要求完全一样。

3). LogMiner日志分析工具仅能够分析Oracle 8以后的产品,对于8以前的产品,该工具也无能为力。


7.  所有相关数据字典视图
V$LOGMNR_CALLBACK              Synonym for V_$LOGMNR_CALLBACK
V$LOGMNR_CONTENTS              Synonym for V_$LOGMNR_CONTENTS
V$LOGMNR_DICTIONARY            Synonym for V_$LOGMNR_DICTIONARY
V$LOGMNR_LOGFILE               Synonym for V_$LOGMNR_LOGFILE
V$LOGMNR_LOGS                  Synonym for V_$LOGMNR_LOGS
V$LOGMNR_PARAMETERS            Synonym for V_$LOGMNR_PARAMETERS
V$LOGMNR_PROCESS               Synonym for V_$LOGMNR_PROCESS
V$LOGMNR_REGION                Synonym for V_$LOGMNR_REGION
V$LOGMNR_SESSION               Synonym for V_$LOGMNR_SESSION
V$LOGMNR_STATS                 Synonym for V_$LOGMNR_STATS
V$LOGMNR_TRANSACTION           Synonym for V_$LOGMNR_TRANSACTION

阅读(814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~