LogMiner提供了一个处理重做日志文件并将其内容翻译成代表对数据库的逻辑操作的SQL语句的过程。LogMiner运行在Oracle版本8.1或者更高版本中。
一,如何使用Logminer:
先要安装logminer的两个包;以SYS用户运行下面两个脚本,其中第一个脚本dbmslm.sql用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本dbmslmd.sql用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
先要安装logminer的两个包;以SYS用户运行下面两个脚本,其中第一个脚本dbmslm.sql用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本dbmslmd.sql用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>sqlplus /nolog
SQL*Plus: Release 10.2.0.4.0 - Production on星期五4月10 17:49:02 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
SQL> conn sys/oracle as sysdba
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
SQL> conn sys/oracle as sysdba
已连接。
SQL>
SQL> @dbmslm.sql
程序包已创建。
授权成功。
SQL>
SQL> @dbmslmd.sql
程序包已创建。
SQL>
SQL> @dbmslm.sql
程序包已创建。
授权成功。
SQL>
SQL> @dbmslmd.sql
程序包已创建。
二,创建数据字典文件
数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来创建,如果我们要分析的数据库中的表有变化(比如表结构有变化等),影响到库的数据字典也发生变化。另外一种情况是在分析另外一个数据库文件的重做日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
数据字典文件是一个文本文件,使用包DBMS_LOGMNR_D来创建,如果我们要分析的数据库中的表有变化(比如表结构有变化等),影响到库的数据字典也发生变化。另外一种情况是在分析另外一个数据库文件的重做日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
首先需要修改参数UTL_FILE_DIR ,该参数值为服务器中放置数据字典文件的目录,10g中我们通过动态修改参数的方式来修改,然后重新启动数据库生效。其中logs_utl_file目录先期建立好。
SQL> alter system set UTL_FILE_DIR='e:\oracle\product\10.2.0\oradata\test\logs_utl_file' scope=spfile; 系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL>
SQL> startup
ORACLE例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1295608 bytes
Variable Size 125831944 bytes
Database Buffers 33554432 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
数据库已经打开。
SQL>
SQL> show parameter UTL_FILE
NAME TYPE
------------------------------------ -------------
VALUE
------------------------------
utl_file_dir string
e:\oracle\product\10.2.0\oradata\test\logs_utl_file
SQL>
SQL> alter system set UTL_FILE_DIR='e:\oracle\product\10.2.0\oradata\test\logs_utl_file' scope=spfile; 系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL>
SQL> startup
ORACLE例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1295608 bytes
Variable Size 125831944 bytes
Database Buffers 33554432 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
数据库已经打开。
SQL>
SQL> show parameter UTL_FILE
NAME TYPE
------------------------------------ -------------
VALUE
------------------------------
utl_file_dir string
e:\oracle\product\10.2.0\oradata\test\logs_utl_file
SQL>
然后创建数据字典文件:
BEGIN
dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora',dictionary_location => 'e:\oracle\product\10.2.0\oradata\test\logs_utl_file');
END;
/OK ,可以看到在logs_ult_file中已经生成了logminer_dict.ora数据字典文件。数据字典文件是可以打开的文本文件。有兴趣可以打开看看。
创建数据字典是让logminer引用实际到内部数据字典中的部分是使用对象的名称,而不是系统内部的16进制的ID.
dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora',dictionary_location => 'e:\oracle\product\10.2.0\oradata\test\logs_utl_file');
END;
/OK ,可以看到在logs_ult_file中已经生成了logminer_dict.ora数据字典文件。数据字典文件是可以打开的文本文件。有兴趣可以打开看看。
创建数据字典是让logminer引用实际到内部数据字典中的部分是使用对象的名称,而不是系统内部的16进制的ID.
三,创建要分析的日志文件(在线日志或归档日志)的列表
(1)分析在线的重做日志
A。建立列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0\
oradata\test\redo01.log', options=>dbms_logmnr.new);
PL/SQL过程已成功完成。
B。添加其他日至文件到列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\test\redo02.log', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\test\redo03.log', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
(1)分析在线的重做日志
A。建立列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0\
oradata\test\redo01.log', options=>dbms_logmnr.new);
PL/SQL过程已成功完成。
B。添加其他日至文件到列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\test\redo02.log', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\test\redo03.log', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
(2)分析归档的重做日志
A。建立列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'d:\oracle\product\10.2.0
\oradata\archive\ARC00052_0684166863.001', options=>dbms_logmnr.new);
PL/SQL过程已成功完成。
B。添加其他日志文件到列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\archive\ARC00053_0684166863.001', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
A。建立列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'d:\oracle\product\10.2.0
\oradata\archive\ARC00052_0684166863.001', options=>dbms_logmnr.new);
PL/SQL过程已成功完成。
B。添加其他日志文件到列表
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\archive\ARC00053_0684166863.001', options=>dbms_logmnr.addfile);
PL/SQL过程已成功完成。
如果你觉得不需要分析已经在列表中的在线或归档日志,可以通过removefile命令删除:
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\archive\ARC00053_0684166863.001', options=>dbms_logmnr.removefile);
PL/SQL过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'e:\oracle\product\10.2.0
\oradata\archive\ARC00053_0684166863.001', options=>dbms_logmnr.removefile);
PL/SQL过程已成功完成。
四,使用Logminer进行日志分析
无限制条件:
SQL> execute dbms_logmnr.start_logmnr(DictFileName=> 'e:\oracle\product\10.2.0\oradata\test\logs_utl_file\logminer_dict.ora');PL/SQL过程已成功完成。
无限制条件:
SQL> execute dbms_logmnr.start_logmnr(DictFileName=> 'e:\oracle\product\10.2.0\oradata\test\logs_utl_file\logminer_dict.ora');PL/SQL过程已成功完成。
有限制条件:
通过对过程DBMS_LOGMNR.START_LOGMNR中的时间或者SCN参数的设置,可以缩小分析日志文件的范围:
如我们仅仅分析2009年2月23日到2005年7月26日的日志:
SQL> execute dbms_logmnr.start_logmnr(
DictFileName => ' e:\oracle\product\10.2.0
\oradata\test\logs_utl_file\logminer_dict.ora ',
StartTime => to_date('2009-2-23 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2009-2-26 23:59:59','YYYY-MM-DD HH24:MI:SS '));
通过对过程DBMS_LOGMNR.START_LOGMNR中的时间或者SCN参数的设置,可以缩小分析日志文件的范围:
如我们仅仅分析2009年2月23日到2005年7月26日的日志:
SQL> execute dbms_logmnr.start_logmnr(
DictFileName => ' e:\oracle\product\10.2.0
\oradata\test\logs_utl_file\logminer_dict.ora ',
StartTime => to_date('2009-2-23 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2009-2-26 23:59:59','YYYY-MM-DD HH24:MI:SS '));
(这个地方总是抱错误,很郁闷.好象不能加时间限制)
相关的参数如下:
参数参数类型默认值含义
StartScn数字型0分析重作日志中SCN≥StartScn日志文件部分
EndScn数字型0分析重作日志中SCN≤EndScn日志文件部分
参数参数类型默认值含义
StartScn数字型0分析重作日志中SCN≥StartScn日志文件部分
EndScn数字型0分析重作日志中SCN≤EndScn日志文件部分
StartTime日期型1998-01-01分析重作日志中时间戳≥StartTime的日志文件部分
EndTime日期型2988-01-01分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName字符型字典文件该文件包含一个数据库目录的快照。
使用该文件可以使得到的分析结果是可以理解的文本形式,
而非系统内部的16进制
Options BINARY_INTEGER 0系统调试参数,实际很少使用
五,得到分析结果:
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
EndTime日期型2988-01-01分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName字符型字典文件该文件包含一个数据库目录的快照。
使用该文件可以使得到的分析结果是可以理解的文本形式,
而非系统内部的16进制
Options BINARY_INTEGER 0系统调试参数,实际很少使用
五,得到分析结果:
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户TONY对表R_WIP_TST所作的一切工作。
SQL>; SELECT sql_redo FROM v$logmnr_contents WHERE username='TONY' AND tablename='R_WIP_TST';
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr' 这个会话的生命期中存在(如果执行了DBMS_LOGMNR.END_LOGMNR分析结果将消失)。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
如果需要,可以通过removefile命令删除日志分析文件。
SQL>; SELECT sql_redo FROM v$logmnr_contents WHERE username='TONY' AND tablename='R_WIP_TST';
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr' 这个会话的生命期中存在(如果执行了DBMS_LOGMNR.END_LOGMNR分析结果将消失)。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
如果需要,可以通过removefile命令删除日志分析文件。
SQL> execute dbms_logmnr.add_logfile(LogFileName=>'d:\oracle\product\10.2.0\oradata\archive\ARC00052_0684166863.001', ptions=>dbms_logmnr.removefile);
六,使用DBMS_LOGMNR.END_LOGMNR结束日志分析过程,释放内存。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
SQL> execute dbms_logmnr.end_logmnr;
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
SQL> execute dbms_logmnr.end_logmnr;
---------
有的时候,取出的session_info和username是空值,可能和下面的因素有关。
If minimum supplemental logging was not active at the time when the
redo records were created, then LogMiner won't be able to obtain all
the required information. The Oracle10g Database Utilities manual mentions:
"By default, Oracle Database does not provide any supplemental logging,
which means that by default LogMiner is not usable. Therefore, you must
enable at least minimal supplemental logging prior to generating log
files which will be analyzed by LogMiner."
So, we have to Enable supplemental logging by using a command like this then
the redolog that will be generated will contain the information:
redo records were created, then LogMiner won't be able to obtain all
the required information. The Oracle10g Database Utilities manual mentions:
"By default, Oracle Database does not provide any supplemental logging,
which means that by default LogMiner is not usable. Therefore, you must
enable at least minimal supplemental logging prior to generating log
files which will be analyzed by LogMiner."
So, we have to Enable supplemental logging by using a command like this then
the redolog that will be generated will contain the information:
SELECT name, supplemental_log_data_min FROM v$database;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DA