一、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包,该包用来创建数据字典文件。

SQL> @?/rdbms/admin/dbmslm.sql

程序包已创建。

授权成功。

同义词已创建。

SQL> @?/rdbms/admin/dbmslmd.sql

程序包已创建。

同义词已创建。

SQL> show user

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,该参数值为服务器中放置数据字典文件的目录。重新启动数据库,使新加的参数生效,然后创建数据字典文件。

SQL> show user

USER 为 "SYS"

SQL> show parameter utl_file_dir

NAME                                 TYPE        VALUE

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

utl_file_dir                         string

SQL> alter system set utl_file_dir='/u01/app/logminer' scope=spfile;

系统已更改。

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area  238530560 bytes

Fixed Size                  1335724 bytes

Variable Size             150998612 bytes

Database Buffers           83886080 bytes

Redo Buffers                2310144 bytes

数据库装载完毕。

数据库已经打开。

SQL> show parameter utl_file_dir

NAME                                 TYPE        VALUE

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

utl_file_dir                         string      /u01/app/logminer

SQL> exec dbms_logmnr_d.build( 'dictionary.ora', '/u01/app/logminer');

PL/SQL 过程已成功完成。

开始之前

SQL> show user

USER 为 "SYS"

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

NO

SQL> alter database add supplemental log data;

数据库已更改。

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

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)分析在线重作日志文件

SQL> show user

USER 为 "SYS"

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME

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

1          1         67   52428800        512          1 YES INACTIVE                643449 14-12月-11           653614 15-12月-11

2          1         68   52428800        512          1 NO  CURRENT                 653614 15-12月-11       2.8147E+14

3          1         66   52428800        512          1 YES INACTIVE                614556 13-12月-11           643449 14-12月-11

SQL> select * from v$logfile;

GROUP# STATUS  TYPE    MEMBER                                                       IS_

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

1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                      NO

2         ONLINE  /u01/app/oracle/oradata/orcl/redo02.log                      NO

3         ONLINE  /u01/app/oracle/oradata/orcl/redo03.log                      NO

SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log', dbms_logmnr.new);

PL/SQL 过程已成功完成。

SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log', dbms_logmnr.addfile);

PL/SQL 过程已成功完成。

SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log', dbms_logmnr.addfile);

PL/SQL 过程已成功完成。

删除列表中的日志文件:exec dbms_logmnr.add_logfile('/u01/app/Oracle/oradata/orcl/redo03.log', dbms_logmnr.removefile);

关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。

3、使用logminer进行日志分析

(1)无限制条件

SQL> exec dbms_logmnr.start_logmnr( dictfilename=>'/u01/app/logminer/dictionary.ora');

PL/SQL 过程已成功完成。

(2)有限制条件

通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。

如下面的例子,我们仅仅分析2004年9月18日的日志,:

SQL> EXECUTE dbms_logmnr.start_logmnrdictfilename => '/u01/app/logminer/dictionary.ora',starttime => to_date('2006-02-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),endtime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));

也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:

SQL> EXECUTE dbms_logmnr.start_logmnr( dictfilename => '/u01/app/logminer/dictionary.ora', startscn => 20, endscn => 50);

参数

参数类型

默认值

含义

StartScn

数字型(Number)

0

分析重作日志中SCN≥StartScn日志文件部分

EndScn

数字型(Number)

0

分析重作日志中SCN≤EndScn日志文件部分

StartTime

日期型(Date)

1998-01-01

分析重作日志中时间戳≥StartTime的日志文件部分

EndTime

日期型(Date)

2988-01-01

分析重作日志中时间戳≤EndTime的日志文件部分

DictFileName

字符型(VARCHAR2)

0

字典文件,该文件包含一个数据库目录的快照。使用该文件可以使得到的分析结果是可以理解的文本形式,

4、观察分析结果(v$logmnr_contents)

一共有四个表,详细说明如下

V$LOGMNR_DICTIONARY-------查询使用的数据字典文件

SQL> select filename from v$logmnr_dictionary;

FILENAME

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

/u01/app/logminer/dictionary.ora

V$LOGMNR_PARAMETERS-------查询当前LogMiner设定的参数

SQL> select * from v$logmnr_parameters;

START_DATE     REQUIRED_START END_DATE        START_SCN REQUIRED_START_SCN    END_SCN    OPTIONS INFO                                 STATUS

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

01-1月 -11         614556                  0          0          0                                           0

V$LOGMNR_LOGS-------查询分析的日志文件

SQL> select filename from v$logmnr_logs;

FILENAME

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

/u01/app/oracle/oradata/orcl/redo03.log

/u01/app/oracle/oradata/orcl/redo01.log

/u01/app/oracle/oradata/orcl/redo02.log

V$LOGMNR_CONTENTS-------日志文件的内容

到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含logminer分析得到的所有的信息。SQL> select scn,timestamp,sql_redo from v$logmnr_contents;

如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户DB_ZGXT对表SB_DJJL所作的一切工作。

SQL> select operation,sql_redo,sql_undo from v$logmnr_contents where seg_owner='U1' and seg_name='TEST';

未选定行

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

需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的logminer存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。

SQL> exec dbms_logmnr.end_logmnr;

PL/SQL 过程已成功完成。

SQL> select * from v$logmnr_contents;

select * from v$logmnr_contents

*

第 1 行出现错误:

ORA-01306: 在从 v$logmnr_contents 中选择之前必须调用 dbms_logmnr.start_logmnr()

四、其他注意事项

我们可以利用logminer日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装logminer的数据库实例的redo logs文件。使用logminer分析其他数据库实例时,有几点需要注意:

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

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

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

五、结语

logminer对于数据库管理员(DBA)来讲是个功能非常强大的工具,也是在日常工作中经常要用到的一个工具,借助于该工具,可以得到大量的关于数据库活动的信息。其中一个最重要的用途就是不用全部恢复数据库就可以恢复数据库的某个变化。另外,该工具还可用来监视或者审计用户的活动,如你可以利用logminer工具察看谁曾经修改了那些数据以及这些数据在修改前的状态。我们也可以借助于该工具分析任何Oracle 8及其以后版本产生的重作日志文件。另外该工具还有一个非常重要的特点就是可以分析其他数据库的日志文件。总之,该工具对于数据库管理员来讲,是一个非常有效的工具,深刻理解及熟练掌握该工具,对于每一个数据库管理员的实际工作是非常有帮助的。

六、例子

首先用一个用户u1做一些dml操作:

SQL> show user

USER 为 "U1"

SQL> delete from t1 where id=3;

已删除 1 行。

SQL> insert into t1 values(3,'test');

已创建 1 行。

SQL> commit;

提交完成。

SQL> update t1 set value = 'v3' where id = 3;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select * from t1;

ID VALUE

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

1 v1

2 v2

3 v3

开始分析:

SQL> show user

USER 为 "SYS"

SQL> alter system switch logfile;

系统已更改。

SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2011_12_15/o1_mf_1_80_7gmqb6t5_.arc', dbms_logmnr.new);

PL/SQL 过程已成功完成。

SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/logminer/dictionary.ora');

PL/SQL 过程已成功完成。

查看结果:

SQL> select filename from v$logmnr_dictionary;

FILENAME

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

/u01/app/logminer/dictionary.ora

SQL> select * from v$logmnr_parameters;

START_DATE     REQUIRED_START END_DATE        START_SCN REQUIRED_START_SCN    END_SCN    OPTIONS INFO                                 STATUS

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

01-1月 -11         653614                  0          0          0                                           0

SQL> select filename from v$logmnr_logs;

FILENAME

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

/u01/app/oracle/oradata/orcl/redo02.log

SQL> select operation,sql_redo,sql_undo from v$logmnr_contents where seg_owner='U1' and seg_name='T1';

OPERATION       SQL_REDO                                           SQL_UNDO

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

DELETE          delete from "U1"."T1" where "ID" = '3' and "VALUE" insert into "U1"."T1"("ID","VALUE") values ('3','v

= 'v3' and ROWID = 'AAAR3vAAFAAAACFAAC';          3');

INSERT          insert into "U1"."T1"("ID","VALUE") values ('3','t delete from "U1"."T1" where "ID" = '3' and "VALUE"

est');                                              = 'test' and ROWID = 'AAAR3vAAFAAAACFAAB';

UPDATE          update "U1"."T1" set "VALUE" = 'v3' where "VALUE"  update "U1"."T1" set "VALUE" = 'test' where "VALUE

= 'test' and ROWID = 'AAAR3vAAFAAAACFAAB';         " = 'v3' and ROWID = 'AAAR3vAAFAAAACFAAB';

SQL> select operation,sql_redo,sql_undo,seg_owner,seg_name from v$logmnr_contents;

OPERATION       SQL_REDO                                           SQL_UNDO                                           SEG_OWNER       SEG_NAME

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

START           set transaction read write;

DELETE          delete from "U1"."T1" where "ID" = '3' and "VALUE" insert into "U1"."T1"("ID","VALUE") values ('3','v U1              T1

= 'v3' and ROWID = 'AAAR3vAAFAAAACFAAC';          3');

INTERNAL

INSERT          insert into "U1"."T1"("ID","VALUE") values ('3','t delete from "U1"."T1" where "ID" = '3' and "VALUE" U1              T1

est');                                              = 'test' and ROWID = 'AAAR3vAAFAAAACFAAB';

COMMIT          commit;

START           set transaction read write;

UPDATE          update "U1"."T1" set "VALUE" = 'v3' where "VALUE"  update "U1"."T1" set "VALUE" = 'test' where "VALUE U1              T1

OPERATION       SQL_REDO                                           SQL_UNDO                                           SEG_OWNER       SEG_NAME

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

= 'test' and ROWID = 'AAAR3vAAFAAAACFAAB';         " = 'v3' and ROWID = 'AAAR3vAAFAAAACFAAB';

COMMIT          commit;

已选择8行。

结束分析:

SQL> exec dbms_logmnr.end_logmnr;

PL/SQL 过程已成功完成。

oracle logminer java_Oracle logminer相关推荐

  1. oracle 挖掘日志,Oracle 日志挖掘(LogMiner)使用详解

    Logminer依赖于2个包:DBMS_LOGMNR和DBMS_LOGMNR_D,Oracle 11g默认已安装 Logminer 基本使用步骤 <1>. Specify a LogMin ...

  2. 使用Oracle 10g的Logminer挖掘日志

    Logminer是oracle从8i开始提供的用于分析重做日志信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D两个package,后边的D是字典的意思.它既能分析redo log ...

  3. 死锁oracle rac,利用LOGMINER进行RAC环境下的死锁分析——转载

    RAC中的死锁的判断机制跟单机很不相同,比单机要复杂的多,而且消耗的时间和资源也比单机要多的多,所以亚马逊的DBA TEAM曾经在一份经验总结中指出如果是并发非常大的OLTP系统,如果锁的问题处理不好 ...

  4. oracle 执行java_oracle调用JAVA类的方法

    oracle调用JAVA类的方法主要有以下三种: 1. 用loadjava方法装载: 可能是调试方便,据说这种方法比较通用. c:\test\hello.java public class hello ...

  5. oracle wallet java_oracle Wallet的使用

    oracle Wallet的使用(即内部加密技术TDE(Transparent Data Encryption )) 1. TDE是Oracle10gR2中推出的一个新功能,使用时要保证Oracle版 ...

  6. oracle wallet java_Oracle Wallet初探

    初探 1.什么是Wallet A datastructure used to store and manage security credentials for an individualentity ...

  7. oracle wallet java_oracle wallet实践及常用维护操作

    Wallet作用 从Oracle 10g R2开始, 通过使用Oracle Wallet达到任意用户不使用密码登录数据库(非操作系统认证方式), 这对在shell中要使用用户密码登录数据库进行操作的脚 ...

  8. oracle aq java_Oracle AQ 的使用(-)

    随着不同应用模块间的消息交互和通信成为一个关键的功能,并且变得越来越重要.Oracle引入了一种强大的队列机制,通过它程序间可以实现信息的交互,oracle把它称作为AQ - Advanced Que ...

  9. oracle rowid java_oracle数据库之rownum和rowid用法

    Rownum和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录. 以下通过例子讲解: --为了方便,首先,查找dept表中的所有. select deptno,dn ...

最新文章

  1. 中学再不学编程就晚了?MIT、JHU研究:程序员大脑思考代码的机制不对劲
  2. 连续2年入不敷出,青云流血冲刺科创板:拟募资11.88亿,最近三年净亏4.37亿
  3. eclipse java代码乱码怎么解决_eclipse java 乱码怎么解决
  4. [云炬ThinkPython阅读笔记]2.3 表达式和语句
  5. BZOJ 3039: 玉蟾宫( 悬线法 )
  6. mysql按中文拼音字母排序_解析MySQL按常规排序、自定义排序和按中文拼音字母排序的方法...
  7. 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 数据渲染模块
  8. 机器学习方向企业面试题(一)
  9. 【数据仓库】数据仓库设计前如何粗估所需的存储空间大小?
  10. 模糊查询是如何进行实现的_模糊查找,不是近似查找!在Excel中应该如何进行模糊匹配...
  11. SVN提交时显示:Path is not a working copy directory
  12. octave运行.m文件
  13. textview加下划线
  14. php 万网域名查询接口
  15. Excel如何快速筛选?
  16. 解决VS Code 运行 “conda : The term ‘conda‘ is not recognized as the name of a cmdlet, function, script “
  17. 轻量而敏捷的工业组态软件UI设计工具-ConPipe Studio 2022
  18. 《安富莱嵌入式周报》第283期:全开源逆向“爆破”硬件工具,Linux内核6.1将正式引入RUST语言,I3C培训教程,80款市场成熟的电感式位置传感器设计
  19. ozip解密_【ozip转换解包】ROM制作工具已适配机型列表,全网最全!
  20. STM32F407ZGT6最小系统原理图和PCB

热门文章

  1. nodejs TCP服务器和客户端通信的socket结构
  2. PCM - partner channel management 的数据库表介绍
  3. Product Archive相关的标准function module
  4. 使用report找出系统里维护了available status reason的document
  5. ${project.build.directory}
  6. How to judge if one model data is out of date
  7. 一个简单的从windows系统往AWS上直接拷贝文件的脚本
  8. cgi+bin+php,crontab+php-cgi/php 定时执行PHP脚本
  9. 18岁初中毕业学Java_刚满十八 初中毕业 java自学完了 没学历 该怎么办?
  10. python加密解密库openssl_OpenSSL和Python实现RSA Key公钥加密私钥解密