ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在oracle9i中用logminer分析归档日志文件

在oracle9i中用logminer分析归档日志文件

原创 Linux操作系统 作者:jlsytl 时间:2010-07-27 13:40:40 0 删除 编辑

LogMiner是集成在Oracle8i/Oracle9i数据库产品中的日志分析工具,通过该工具可以分析重做日志和归档日志中的所有事务变化,并能准确地确定各种DML和DDL操作的具体时间和SCN值。对重做日志和归档日志进行分析的目的是为了恢复由于执行了误操作而丢失的数据。


LogMiner是集成在Oracle8i/Oracle9i数据库产品中的日志分析工具,通过该工具可以分析重做日志和归档日志中的所有事务变化,并能准确地确定各种DML和DDL操作的具体时间和SCN值。对重做日志和归档日志进行分析的目的是为了恢复由于执行了误操作而丢失的数据。

使用LogMiner可实现:①确定数据逻辑损坏的时间。例如,用户执行了DROP TABLE和TRUNCATE TABLE命令等误操作后,使用LogMiner可以准确定位执行这些误操作的具体时间。注意:Oracle8i只能还原DML操作,不能还原DDL操作;Oracle9i可以还原DDL以及DML操作。②跟踪用户执行的事务变化操作。使用LogMiner不仅可以跟踪用户所执行的各种DML操作和DDL操作,而且还可以取得数据变化。③跟踪表的DML操作,使用LogMiner可以跟踪在表上所发生的所有事务变化。

结合我们的NC和IUFO产品,有时候用户理论上应该存在的数据莫名其妙地丢了,问题提交给程序员,他们也很难在短时间内确定问题的症结所在。所以这时候就要求我们的技术顾问具有相应的技能,能够使用LogMiner快速协助程序员查找原因。

下面以Oracle9i(9.2.0.4)for Windows 2000/NT为例说明如何使用LogMiner对重做日志和归档日志进行分析。本文进行的所有操作均在该环境下验证通过,文中使用的数据库Oracle_sid为wangwj,当然了数据库必须运行在归档模式下。

一、LogMiner的几点说明

1、LogMiner可以帮你确定在某段时间所发的各种DML,DDL操作的具体时间和SCN号,它所依据的是归档日志文件及联机日志文件。

2、它只能在Oracle8i及以后的版本中使用,不过它可以分析Oracle8的日志。

3、Oracle8i只能用于分析DML操作,到Oracle9i则可以分析DDL操作了。

4、LogMiner不支持索引组织表、Long、LOB及集合类型。

5、MTS的环境也不能使用LogMiner.

二、生成归档日志

下面以分析TMP表的DDL和DML操作为例,介绍使用LogMiner分析重做日志和归档日志的全过程。我们首先在表TMP上执行以下DDL以及DML操作,并生成归档日志:

sqlplus zjbbs/zjbbs

create table tmp(name varchar2(10),no number(3));

alter system switch logfile;

insert into tmp values(‘liming’,112);

update tmp set no=200;

commit;

alter system switch logfile;

delete from tmp;

alter system switch logfile;

通过上面的操作会产生三个连续的归档日志文件T001S00148.ARC、T001S00149.ARC、T001S00150.ARC,为了操作方便我将它们重新在当前目录下复制了一份,并重命名为test1.ARC、test2.ARC、test3.ARC。

三、建立字典文件

字典文件用于存放表及对象ID号之间的对应关系。当使用字典文件时,它会在表名和对象ID号之间建立一一对应的关系。因此需要注意,如果用户建立了新表之后,并且将来可能会对该表进行日志分析,那么就需要重新建立字典文件,以将其对象名及对象ID号存放到字典文件中。

1.修改数据库参数文件,添加参数:UTL_FILE_DIR= C:oracleora92databaselogminer

目录logmnr必须事先手工建立,该目录用于存放产生的字典文件,目录名称可以自定。

2.用新的参数文件重新启动数据库

3.建立字典文件

BEGIN dbms_logmnr_d.build(dictionary_filename=>'dict.ora',

dictionary_location=>'C:oracleora92databaselogminer');

END;

/

注意:参数dictionary_filename用以指定字典文件的文件名;参数 dictionary_location用于指定存放字典文件所在的目录,该目录必须与初始化参数UTL_FILE_DIR的值一致。如果指定的字典文件名dict.ora已经存在,则应在执行此操作前将其彻底删除(从垃圾箱中删除),否则执行该过程将失败。

四、建立日志分析表

建立日志分析列表必须在MOUNT或NOMOUNT状态下完成。

1.停止并装载数据库

sqlplus “/ as sysdba”

shutdown immediate

startup mount

2.建立日志分析列表

在“生成归档日志”的操作中已经生成了三个连续的归档日志文件,通过以下操作建立日志分析列表:

BEGIN

dbms_logmnr.add_logfile(options=>dbms_logmnr.new,

logfilename=>'C:oracleora92databasearchivetest1.arc');

END;

/

其中的options有三种取值,dbms_logmnr.new用于建一个日志分析表;dbms_logmnr.addfile用于加入用于分析的的日志文件;dbms_logmnr.removefile用于移出用于分析的日志文件。3.增加其它欲进行分析的日志文件

BEGIN

dbms_logmnr.add_logfile(options=>dbms_logmnr.addfile, logfilename=>'C:oracleora92databasearchivetest2.arc');

END;

/

用同样的方法将归档日志文件test3.arc增加到日志分析列表中。可以通过动态性能视图v$logmnr_logs查看日志分析列表中有哪些待分析的日志文件。

SQL> select filename from v$logmnr_logs;

FILENAME

--------------------------------------------

C:oracleora92databasearchivetest1.arc

C:oracleora92databasearchivetest2.arc

C:oracleora92databasearchivetest3.arc

四、启动LogMiner执行分析

BEGIN

dbms_logmnr.start_logmnr(

dictfilename=>'C:oracleora92databaselogminerdict.ora',

starttime=>to_date('2005-07-28:08:58:00','YYYY-MM-DD:HH24:MI:SS'),

endtime=>to_date('2005-08-14:01:12:00','YYYY-MM-DD:HH24:MI:SS'));

END;

/

注意:此过程能否执行成功的关键是给出的starttime(起始时间)和endtime(终止时间)应在一个有效的范围内。特别是终止时间,应小于或等于归档日志的建立时间;如果大于归档日志的建立时间,则不能执行分析过程。分析多个归档日志时,这些归档日志最好是连续的。

五、查看日志分析结果

a、查看DML操作,示例:

SQL>select operation,sql_redo,sql_undo from v$logmnr_contents where seg_name='TMP';

OPERATION SQL_REDO SQL_UNDO

-----------------------------------------------------------------------------------------------

DDL create table tmp(name varchar2(10),no number(3));

INSERT insert into "SYS"."TMP"("NAME","NO") values ('liming','112'); delete from "SYS"."TMP" where "NAME" = 'liming' and "NO" = '112' and ROWID = 'AAAM6XAABAAANlKAAA';

UPDATE update "SYS"."TMP" set "NO" = '200' where "NO" = '112' and ROWID = 'AAAM6XAABAAANlKAAA'; update "SYS"."TMP" set "NO" = '112' where "NO" = '200' and ROWID = 'AAAM6XAABAAANlKAAA';

DELETE delete from "SYS"."TMP" where "NAME" = 'liming' and "NO" = '200' and ROWID = 'AAAM6XAABAAANlKAAA'; insert into "SYS"."TMP"("NAME","NO") values ('liming','200');

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

b、查看DDL操作,示例:

SQL> SELECT timestamp,sql_redo FROM v$logmnr_contents WHERE sql_redo like '%create%';

 

TIMESTAMP SQL_REDO

------------------------------------------------------------------------------------

14-8月 -05 create pfile='c:wangwj.ora' from spfile;

14-8月 -05 create spfile from pfile='c:wangwj.ora';

14-8月 -05 create table tmp(name varchar2(10),no number(3));

六、结束LogMiner的分析

SQL>execute dbms_logmnr.end_logmnr;

结束LogMiner分析后,服务器进程会自动删除与LogMiner相关的动态性能视图所包含的事务变化内容。

七、与LogMiner相关的数据字典

1、v$loglist 它用于显示历史日志文件的一些信息

2、v$logmnr_dictionary 因logmnr可以有多个字典文件,该视图用于显示这方面信息

3、v$logmnr_parameters 它用于显示logmnr的参数

4、v$logmnr_logs 它用于显示用于分析的日志列表信息

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

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

注册时间:2010-07-13

  • 博文量
    10
  • 访问量
    11166