引用:http://www.cnblogs.com/shishanyuan/p/3140440.html
1 Logminer简介
1.1 LogMiner介绍
Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle
在线/归档日志文件中的具体内容,特别是该工具可以分析出所有对于数据库操作的DML和DDL语句。该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图(Oracle8i内置包的一部分)组成,它作为Oracle数据库的一部分
来发布是8i产品提供的一个完全免费的工具。但该工具和其他Oracle内建工具相比使用起来显得有些复杂,主要原因是该工具没有提供任何的图形用户界面
(GUI)。
1.2 LogMiner作用
在Oracle
8i之前,Oracle没有提供任何协助数据库管理员来读取和解释重作日志文件内容的工具。系统出现问题,对于一个普通的数据管理员来讲,唯一可以作的工
作就是将所有的log文件打包,然后发给Oracle公司的技术支持,然后静静地等待Oracle
公司技术支持给我们最后的答案。然而从8i以后,Oracle提供了这样一个强有力的工具--LogMiner。
LogMiner 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重作日志文件。
总的说来,LogMiner工具的主要用途有:
1、跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。
2、回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。
3、优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式
1.3 使用详解
1.3.1 安装LogMiner
在使用LogMiner之前需要确认Oracle是否带有进行LogMiner分析包,一般来说Windows操作系统Oracle10g以上都默
认包含。如果不能确认,可以DBA身份登录系统,查看系统中是否存在运行LogMiner所需要的dbms_logmnr、dbms_logmnr_d
包,如果没有需要安装LogMiner工具,必须首先要运行下面这样两个脚本:
1、$ORACLE_HOME/rdbms/admin/dbmslm.sql
2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql.
这两个脚本必须均以DBA用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
创建完毕后将包括如下过程和视图:
类型 | 过程名 | 用途 |
过程 | Dbms_logmnr_d.build | 创建一个数据字典文件 |
过程 | Dbms_logmnr.add_logfile | 在类表中增加日志文件以供分析 |
过程 | Dbms_logmnr.start_logmnr | 使用一个可选的字典文件和前面确定要分析日志文件来启动LogMiner |
过程 | Dbms_logmnr.end_logmnr | 停止LogMiner分析 |
视图 | V$logmnr_dictionary | 显示用来决定对象ID名称的字典文件的信息 |
视图 | V$logmnr_logs | 在LogMiner启动时显示分析的日志列表 |
视图 | V$logmnr_contents | LogMiner启动后,可以使用该视图在SQL提示符下输入SQL语句来查询重做日志的内容 |
1.3.2 创建数据字典文件
LogMiner工具实际上是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_
LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动LogMiner时创建)组成。在使
用LogMiner工具分析redo log文件之前,可以使用DBMS_LOGMNR_D
包将数据字典导出为一个文本文件。该字典文件是可选的,但是如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值
都将是16进制的形式,我们是无法直接理解的。例如,下面的sql语句:
INSERTINTOdm_dj_swry (rydm, rymc)VALUES(00005,'张三');
LogMiner解释出来的结果将是下面这个样子:
insertintoObject#308(col#1, col#2)values(hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));
创建数据字典的目的就是让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。数据字典文件是一个文本
文件,使用包DBMS_LOGMNR_D来创建。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另
外一种情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
创建数据字典文件之前需要配置LogMiner文件夹:
1CREATEDIRECTORY utlfileAS'D:\oracle\oradata\practice\LOGMNR';2altersystemsetutl_file_dir='D:\oracle\oradata\practice\LOGMNR'scope=spfile;
创建字典文件需要以DBA用户登录,创建到上面配置好的LogMiner文件夹中:
1CONN LOGMINER/LOGMINER@PRACTICEASSYSDBA2EXECUTEdbms_logmnr_d.build(dictionary_filename=>'dictionary.ora', dictionary_location=>'D:\oracle\oradata\practice\LOGMNR');
1.3.3 加入需分析的日志文件
Oracle的LogMiner可以分析在线(online)和归档(offline)两种日志文件,加入分析日志文件使用
dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.NEW参数,后面文件使用
dbms_logmnr.ADDFILE参数。
1、创建列表
1BEGIN2dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW);3END;4/
2、添加其他日志文件到列表
1BEGIN2dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE);3dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00003_0817639922.001',options=>dbms_logmnr.ADDFILE);4END;5/
1.3.4 使用LogMiner进行日志分析
Oracle的LogMiner分析时分为无限制条件和限制条件两种,无限制条件中分析所有加入到分析列表日志文件,限制条件根据限制条件分析指定范围日志文件。
1、无限制条件
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
2、有限制条件
通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。
参数 | 参数类型 | 默认值 | 含义 |
StartScn | 数字型 | 0 | 分析重作日志中SCN≥StartScn日志文件部分 |
EndScn | 数字型 | 0 | 分析重作日志中SCN≤EndScn日志文件部分 |
StartTime | 日期型 | 1998-01-01 | 分析重作日志中时间戳≥StartTime的日志文件部分 |
EndTime | 日期型 | 2988-01-01 | 分析重作日志中时间戳≤EndTime的日志文件部分 |
DictFileName | 字符型 | | 字典文件该文件包含一个数据库目录的快照。 |
如下面的例子,我们仅仅分析2013年6月8日的日志,:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName => dictfilename=>'D:\..\practice\LOGMNR\dictionary.ora',
StartTime =>to_date('2013-6-8 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime =>to_date(''2013-6-8 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName =>'D:\..\practice\LOGMNR\dictionary.ora',
StartScn =>20,
EndScn =>50);
1.3.5 观察分析结果(v$logmnr_contents)
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户LOGMINER对表EMP所作的一切工作。
SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP';
序号 | 名称 | 含义 |
1 | SCN | 特定数据变化的系统更改号 |
2 | TIMESTAM | 数据改变发生的时间 |
3 | COMMIT_TIMESTAMP | 数据改变提交的时间 |
4 | SEG_OWNER | 数据发生改变的段名称 |
5 | SEG_NAME | 段的所有者名称 |
6 | SEG_TYPE | 数据发生改变的段类型 |
7 | SEG_TYPE_NAME | 数据发生改变的段类型名称 |
8 | TABLE_SPACE | 变化段的表空间 |
9 | ROW_ID | 特定数据变化行的ID |
10 | SESSION_INFO | 数据发生变化时用户进程信息 |
11 | OPERATION | 重做记录中记录的操作(如INSERT) |
12 | SQL_REDO | 可以为重做记录重做指定行变化的SQL语句(正向操作) |
13 | SQL_UNDO | 可以为重做记录回退或恢复指定行变化的SQL语句(反向操作) |
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这
个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。