使用dbms_logmnr分析oracle日志
1. 安装LogMiner工具,以SYSDBA的身份运行以下两个脚本文件
ORACLE_HOME\rdbms\admin\dbmslm.sql;
ORACLE_HOME\rdbms\admin\dbmslmd.sql;
第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
2. 授权:
GRANT EXECUTE_CATALOG_ROLE TO USER;
3. 准备日志文件
查看当前在线的redo log:
Select * from v$logfile;
查看归档日志文件的路径:
Select name,value from v$parameter t where t.name like ‘%archive_dest%’;
4. 添加日志文件到logmnr
BEGIN
SYS.DBMS_LOGMNR.ADD_LOGFILE(‘E:\ORACLE\ORADATA\ORCL\REDO_002.LOG’,SYS.DBMS_LOGMNR.NEW);
SYS.DBMS_LOGMNR.ADD_LOGFILE(‘E:\ORACLE\ORADATA\ORCL\REDO_003.LOG’,SYS.DBMS_LOGMNR.ADDFILE);
END;
(可通过desc sys.dbms_logmnr来查看包sys.dbms_logmnr的过程和常量)
查看已添加的日志文件
Select * from v$logmnr_logs;
5. 移除日志文件
SYS.DBMS_LOGMNR.ADD_LOGFILE(‘E:\ORACLE\ORADATA\ORCL\REDO_002.LOG’,SYS.DBMS_LOGMNR.REMOVEFILE);
6. Begin a log miner session(START_LOGMNR):
SYS.DBMS_LOGMNR.START_LOGMNR(
Options => sys.dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
或者
dbms_logmnr.start_logmnr(
startTime => to_date('2007-02-28 10:00:00','yyyy-mm-dd hh24:mi:ss'),
endTime => to_date('2007-02-28 15:00:00','yyyy-mm-dd hh24:mi:ss'),
DictFileName => 'G:\oracle\logs\dict.ora');
dbms_logmnr.start_logmnr函数的原型为:
PROCEDURE start_logmnr(
startScn IN NUMBER default 0 ,
endScn IN NUMBER default 0,
startTime IN DATE default '',
endTime IN DATE default '',
DictFileName IN VARCHAR2 default '',
Options IN BINARY_INTEGER default 0 );
7. 查看日志内容
Select t.* From V$LOGMNR_CONTENTS t
8. Competes a log miner session(END_LOGMNR 释放内存):
BEGIN
SYS.DBMS_LOGMNR.END_LOGMNR();
END;
当然也可以使用 LogMinor Viewer工具来查看,启动命令:oemapp.bat lmviewer
附:创建数据字典文件(data-dictionary)
在初始化参数文件中指定数据字典文件的位置,即添加参数UTL_FILE_DIR,该参数为服务器中放置数据字典文件的目录。
创建数据字典文件:
SYS.DBMS_LOGMNR_D.BUILD(
dictionary_filename=>’dict.ora’,
dictionary_location=>’E:\oracle\logs’);
创建数据字典的目 : 让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来创建。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外一种情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。 在使用LogMiner工具分析redo log文件之前,可以使用DBMS_LOGMNR_D 包将数据字典导出为一个文本文件。该字典文件是可选的,但是如果没有它,LogMiner解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是16进制的形式,我们是无法直接理解的。
查看所有与logmnr相关的视图
select * from dict t where t.table_name like '%LOGMNR%'