Oracle:详解Logminer

 前言
Oracle的重做日志分为两种,联机重做日志文件(online Redo log)和归档重做日志(Archive Redo log )文件;本文主要归档重做日志(Archive Redo log )文件,在线日志在分析方法上相似。
由于各种因素,Oracle的重做日志(redo log)文件无法通过各种文本软件直接读取,而Oracle自带的LogMiner是分析日志最优选择。
LogMiner: Oracle自8i后提供的,通过SQL命令形式来查询和解析redo(重做)和undo(撤销)日志的工具。

1.安装LogMiner--简单
LogMiner是Oracle自带的日志解析工具,安装时只要运行sql脚本即可,安装一次就ok。

首先运行下面这样两个脚本,这两个脚本必须均以SYS用户身份运行。
其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

两个文件的位置:
1 $ORACLE_HOME/rdbms/admin/dbmslm.sql
2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql.

操作命令:
SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslm.sql
程序包已创建。
授权成功。

SQL> @d:\oracle\product\10.2.0\db_2\RDBMS\ADMIN\dbmslmd.sql
程序包已创建。

2.创建数据字典(data-dictionary)--根据实际情况选择
数据字典用来解析日志中的十六进制的数据项(如日志中的sql语句的列名称)。

3种可选的方式,创建供LogMiner访问数据字典。
1)直接访问数据库中在线的数据字典。
这种方式简单,方便,但是由于数据字典是当前最新的,可能不匹配过去的log中的信息。
使用方法:在启动logMiner进行分析的时候,使用DICT_FROM_ONLINE_CATALOG选项。如下所示:
SQL> EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
最好以sys sysdba身份登录执行该命令。

2)将数据字典导出为一个文件。
这种方式是将某个时间点的数据字典导出为文件;在logMiner启动分析的时候(见第四步)通过options参数指定该文件的名称和路径,以解析日志。
如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外,在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
使用方法:
a. 首先调整spfile参数;
b. 然后创建数据字典文件;
SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename =>'logmn_ora817.dat',dictionary_location => ' D:Oraclelogs ');
# 注意,dictionary_location必须和UTL_FILE_DIR参数所指的目录相同。

3)将数据字典导出到log文件中。
要将数据库字典信息提取到重做日志文件,数据库必须处于ARCHIVELOG 模式。
导出时,使用STORE_IN_REDO_LOGS 选项。例如:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD (
SQLPLUS>options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

3、创建要分析的日志文件列表---日志绝对路径
参数logfilename的值是日志文件的绝对路径(字符串)。

A.添加日志文件
SQL>execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00013_0736960501.001');
B.继续添加。。。
SQL>execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00014_0736960501.001');
继续添加。。。
SQL> execute dbms_logmnr.add_logfile(options
=>dbms_logmnr.addfile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00015_0736960501.001');
也可以删除(不常用)
SQL> execute dbms_logmnr.add_logfile(options=>dbms_logmnr.removefile,logfilename=>'E:\app\Administrator\product\11.1.0\db_1\RDBMS\ARC00015_0736960501.001');
需要分析日志文件的个数完全由调用者决定。
另外,Oracle提供归档日志视图(v$archived_log),通过select * from v$archived_log可查询已存档日志文件的信息(绝对路径、存档时间等);(需要DBA权限登录)
有关v$archived_log视图的详细信息请参考Oracle官方文档:http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_1016.htm

4.启动LogMiner进行分析--关键

(1)无限制条件
SQL> EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

(2)有限制条件
调用者通过对dbms_logmnr.start_logmnr命令的时间(包含StartTime和EndTime)参数和SCN参数(包含StartScn和EndScn)进行设置,可对日志进行按意愿筛选。

时间范围(使用较多):对dbms_logmnr.start_logmnr命令使用StartTime和EndTime参数。
SCN(语句顺序编号)范围:对dbms_logmnr.start_logmnr命令使用StartScn和EndScn参数。

例如,假如想仅仅分析2010-12-07的日志(当然,上一步添加的日志文件需要包含该时间范围,不然会报错):
SQL> EXECUTE dbms_logmnr.start_logmnr( StartTime => to_date('2010-12-07 00:00:00','YYYY-MM-DD HH24:MI:SS'), EndTime => to_date('2010-12-08 23:59:59','YYYY-MM-DD HH24:MI:SS'),options
=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

假如想仅仅分析某个SCN范围内的日志:
SQL> EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG, StartScn => 20, EndScn => 50);

DBMS_LOGMNR.START__LOGMNR命令参数含义
参数 参数类型 默认值 含义
StartScn 数字型(Number) 0 分析重作日志中SCN≥StartScn日志文件部分
EndScn 数字型(Number) 0 分析重作日志中SCN≤EndScn日志文件部分
StartTime 日期型(Date) 1998-01-01 分析重作日志中时间戳≥StartTime的日志文件部分
EndTime 日期型(Date) 2988-01-01 分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName 字符型(VARCHAR2) 字典文件,该文件包含一个数据库目录的快照。使用该文件可以使得到的分析结果是可以理解的文本形式,而非系统内部的16进制

Options BINARY_INTEGER 0 系统调试参数,实际很少使用

该步骤涉及数据字典的使用方法的选择:
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);


5、查看日志分析的结果--关键

动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息,通过Select XX from v$logmnr_contents可以查询。
例如:

select SQL_REDO,to_char(TIMESTAMP,'YYYY-MM-DD HH24:MI:SS'),to_char(COMMIT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') from v$logmnr_contents


SQL> select sql_redo from v$logmnr_contents

a、查看DML操作,示例:
SELECT operation,sql_redo,sql_undo FROM V$logmnr_contents
WHERE operation IN ('INSERT','UPDATE','DELETE') and seg_name = 'QIUYB';

OPERATION SQL_REDO SQL_UNDO
---------- -------------------------- --------------------------
INSERT inser into qiuyb.qiuyb ... delete from qiuyb.qiuyb...

operation--操作类型。
sql_redo--记录已执行的SQL脚本,
sql_undo--用于恢复所做的操作的,与sql_redo相反的SQL脚本。

以上三个字段是比较关键的字段,v$logmnr_contents视图的更多属性字段可查询Oracle官方文档(11g)。http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_1154.htm

b、查看DDL操作,示例:
SELECT timstamp,sql_redo
FROM v$logmnr_contents WHERE operation IN ('DDL') ;

所有的LogMiner的分析过程存储都在PGA内存中,视图v$logmnr_contents是基于dbms_logmrn.start_logmnr会话的。随着进程的结束,会话结束后,视图v$logmnr_content也随之消失。

6.结束LogMiner的分析,结束本次logMiner会话。--简单
DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,所有的LogMiner的分析过程消失,分析结果也随之不再存在。

SQL>BEGIN
2 dbms_logmnr.end_logmnr;
3 end;
4 /


7.注意事项
在利用LogMiner日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装LogMiner的数据库实例的redo logs文件。

使用LogMiner分析其他数据库实例时,有几点需要注意:
1).LogMiner必须使用被分析数据库实例产生的字典文件(第二步创建数据字典的第二种方式),而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。

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

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

4).LogMiner日志分析工具仅的数据字典的方式选择比较重要,根据实际的情况而慎重选择。
5).LogMiner日志分析过程有些繁琐,涉及数据库的知识点较多,需要耐心调试。 

原文地址:https://www.cnblogs.com/tracy/p/2192755.html