/* LogMiner工具的使用 */
LogMiner工具实际上是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOGMNR启动LogMiner时创建)组成
1.解读数据字典,创建logminer字典文件
如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外一种情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件.
a.关闭数据库
b.初始化参数中设置utl_file_dir('f:/oracle/database'),指定数据字典文件的位置
c.打开数据库
d.
SQL> show user;
USER 为"SYS"
SQL> execute dbms_logmnr_d.build('dict.ora','f:/oracle/database');
PL/SQL 过程已成功完成。
如果没有dbms_logmnr_d包,需手工执行@d:/oracle/ora81/rdbms/admin/dbmslmd.sql。
如果执行SQL>execute dbms_logmnr_d.build('wlcdbdict.ora','D:/oracle');
产生如下错误:
BEGIN dbms_logmnr_d.build('wlcdbdict.ora','D:/oracle '); END;
*
ERROR 位于第 1 行:
ORA-06532: 下标超出限制
ORA-06512: 在"SYS.DBMS_LOGMNR_D", line 793
ORA-06512: 在line 1
需要执行以下步骤,才能避免产生错误:
i.修改d:/oracle/ora81/rdbms/admin/dbmslmd.sql文件
打开dbms_logmnr_d包,将type col_desc_array is varray(513) of col_description这个数组的值改大一些
ii.以sys/change_on_install身份登陆
sql*plus>connect sys/change_on_install
iii.执行sql*plus>@d:/oracle/ora81/rdbms/admin/dbmslmd.sql
如果要在oracle 8数据库中使用logminer,把oracle 9i安装目录下的rdbms/admin/dbmslmd.sql复制到oracle 8数据库相应的子目录中,
然后执行该文件,即可创建dbms_logmnr和dbms_logmnr_d包,随后使用相同的方法来创建logminer字典文件.
2.指定用于分析的重做日志文件
a.用new选项来创建新的重做日志文件列表
SQL> execute dbms_logmnr.add_logfile(logfilename=>'f:/oracle/oradata/backup/arc1/arch_1_38.arc',opti
ons=>dbms_logmnr.new);
PL/SQL 过程已成功完成。
b.用addfile选项来添加其它的重做日志文件
SQL> execute dbms_logmnr.add_logfile(logfilename=>'f:/oracle/oradata/backup/arc1/arch_1_37.arc',opti
ons=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
c.用removefile选项来删除不需要的重做日志文件
SQL> execute dbms_logmnr.add_logfile(logfilename=>'f:/oracle/oradata/backup/arc1/arch_1_38.arc',opti
ons=>dbms_logmnr.removefile);
PL/SQL 过程已成功完成。
可以查询v$logmnr_logs获取那些log files已加入log list中。
3.运行logminer
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'f:/oracle/database/dict.ora');
[Q]执行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:无效的月份,这个是什么原因
[A]我们分析start_logmnr包
PROCEDURE start_logmnr(
startScn IN NUMBER default 0 ,
endScn IN NUMBER default 0,
startTime IN DATE default TO_DATE('01-jan-1988','DD-MON-YYYY'),
endTime IN DATE default TO_DATE('01-jan-2988','DD-MON-YYYY'),
DictFileName IN VARCHAR2 default '',
Options IN BINARY_INTEGER default 0 );
可以知道,如果TO_DATE('01-jan-1988','DD-MON-YYYY')失败,将导致以上错误
所以解决办法可以为
1、Alter session set NLS_LANGUAGE=American
2、用类似如下的方法执行
execute dbms_logmnr.start_logmnr (DictFileName=> 'f:/temp2/TESTDICT.ora', starttime => TO_DATE(
'01-01-1988','DD-MM-YYYY'), endTime=>TO_DATE('01-01-2988','DD-MM-YYYY'));
a.进行基于时间的过滤(缩小要分析日志文件的范围,仅仅分析2001年9月18日的日志)
SQL> execute dbms_logmnr.start_logmnr(
dictfilename=>'f:/oracle/database/dict.ora',
StartTime=>to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime=>to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS'));
b.进行基于SCN的过滤(设置起始SCN和截至SCN来限制要分析日志的范围)
SQL> execute dbms_logmnr.start_logmnr(
dictfilename=>'f:/oracle/database/dict.ora',
StartScn=>20,
EndScn=>50);
4.将分析结果输出到v$logmnr_contents视图
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT operation,sql_redo FROM v$logmnr_contents;
如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户HANZO对表SALARY所作的一切工作。
SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='HANZO' AND tablename='SALARY'; 1
视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在SGA内存中,一旦重新启动数据库,分析结果将会丢失,必须重新运行logminer才能再次得到分析结果.
5.结束logminer
清除v$logmnr_logs, v$logmnr_contents, v$logmnr_parmeters中的内容,结束分析。
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 过程已成功完成。
6.其他注意事项
可以利用LogMiner日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装LogMiner的数据库实例的redo logs文件。使用LogMiner分析其他数据库实例时,有几点需要注意:
1. LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。
2. 被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle 8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft NT上运行LogMiner。当然两者的硬件条件不一定要求完全一样。
3. logminer是oracle在oracle8i所提供的新package,Oracle8并没有这个package;但Oracle8中也可以使用logminer。只需将oracle8.1.6之前(dbmslogmnrd.sql, dbmslogmnr.sql, prvtlogmnr.plb)、oracle8.1.6之后(dbmslmd.sql, dbmslm.sql, prvtlm.plb)的文件拷贝到Oracle8所在的机器上并执行这些scripts即可。这样Oracle8中也可以使用logminer.