LogMiner
转自http://www.cnblogs.com/einyboy/archive/2012/06/16/2551972.html
|
SQL> show parameter utl; NAME?????????????????????????? TYPE??????? VALUE ------------------------------------ ----------- ------------------------------ utl_file_dir??????????????????????? string????? /dataoracle/oracle/logminer ? |
?
可以看到该参数的当前设置。如果没有值,必须修改数据库的initsid.ora文件,或者使用如下命令:
?
SQL> alter system set utl_file_dir='/dataoracle/oracle/logminer'scope=spifle; |
?
重新启动数据库,使新加的参数生效
select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
创建字典文件的语句:
?
SQL>exec sys.dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora',dictionary_location =>'/dataoracle/oracle/logminer '); |
?
其中,dictionary.ora是给字典文件起的文件名(可任意)。
整个创建过程,可能需要十几分钟到一个小时,视该数据库的object个数以及繁忙程度而定。完成后,会在/dataoracle/oracle/logminer目录下看到一个名为dictionary.ora的文件。
3.2.2创建要分析的日志文件列表
Oracle的重作日志分为两种,在线(online)和离线(offline)归档日志文件,下面就分别来讨论这两种不同日志文件的列表创建。日志文件和归档日志文件的数量是非常多的。因此事实上不可能把所有的日志文件都分析一遍(你要做也行,不过要保证有足够的空间和时间,并且不怕影响数据库性能),通常选取你感兴趣的时间段内的日志进行分析。
1、分析在线重作日志文件
A. 创建列表
?
SQL> EXECUTE dbms_logmnr.add_logfile( LogFileName=>' /oracle/app/oradata/ora9i/redo01.log', Options=>dbms_logmnr.new); |
?
B. 添加其他日志文件到列表
?
SQL> EXECUTE dbms_logmnr.add_logfile( LogFileName=>' /oracle/app/oradata/ora9i/redo02.log', Options=>dbms_logmnr.addfile); |
?
2、分析离线日志文件
A.创建列表
?
SQL> EXECUTE dbms_logmnr.add_logfile( LogFileName=>' /dataoracle/oracle/archivedata/1_3938.dbf', Options=>dbms_logmnr.new); |
?
B.添加另外的日志文件到列表
?
SQL> EXECUTE dbms_logmnr.add_logfile( LogFileName=>'/dataoracle/oracle/archivedata/1_3939.dbf’, Options=>dbms_logmnr.addfile); |
?
关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。
和添加日志分析列表相对应,使用过程 'dbms_logmnr.removefile'也可以从列表中移去一个日志文件。下面的例子移去上面添加的日志文件/oracle/app/oradata/ora9i/redo02.log
?
SQL> EXECUTE dbms_logmnr.add_logfile( LogFileName=>' /oracle/app/oradata/ora9i/redo02.log ', Options=>dbms_logmnr. REMOVEFILE); |
?
如此反复操作,可以把所有要分析的文件都选取进去。创建了要分析的日志文件列表,下面就可以对其进行分析了。
3.3使用LogMiner进行日志分析
3.3.1无限制条件
?
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName=>' /dataoracle/oracle/logminer/dictionary.ora'); |
?
注意,这里的dictionary.ora就是前面创建的字典文件名。
分析过程根据所选取文件的数据量,可能需要几个小时。有时候,DBA可能并不需要这些日志文件中所有的数据,那么能否只分析部分数据呢?
3.3.2有限制条件
通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2005年1月11日的日志:
?
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName => '/dataoracle/oracle/logminer/dictionary.ora ', StartTime => to_date('2005-1-11 00:00:00','YYYY-MM-DD HH24:MI:SS') EndTime => to_date(''2005-1-11 23:59:59','YYYY-MM-DD HH24:MI:SS ')); |
?
?也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
?
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName => '/dataoracle/oracle/logminer/dictionary.ora ', StartScn => 20,EndScn => 50); |
?
分析结束后,所分析到的数据可以从一个名为 V$LOGMNR_CONTENTS的视图中查询到。我们就可以应用这个视图中的内容来达成目的。
表1 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 |
系统调试参数,实际很少使用 |
?
3.4观察分析结果(v$logmnr_contents)
到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户jdls对表所作的一切工作。
?
?SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='jdls' ; |
?
SQL_REDO 列显示的是所做的操作(SQL语句),SQL_UNDO列显示的是要恢复该操作所需要的SQL语句,只要顺序执行SQL_UNDO的内容,就可以恢复到修改前的数据。
使用这个方法恢复数据,好处在于不会有数据损失。否则只能做 incomplete recovery。
由于所有应用中,其实都是利用v$logmnr_contents这个视图,因此在此介绍一下该视图中特别有用的几个字段:
Seg_name: 表名 ; 注意:表名要大写
Scn: SCN 号码
Sql_redo: 所作的sql语句
Sql_undo: 对应sql_redo,恢复用的sql语句
Timestamp: sql 发出的具体时间
Operation: sql 的类型,分为INSERT,UPDATE,START(set …),???????????????COMMIT(commit),INTERNAL等
Session#: 发出该操作的 session?
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
四、其他注意事项
我们可以利用LogMiner日志分析工具来分析其他数据库实例产生的重作日志文件,而不仅仅用来分析本身安装LogMiner的数据库实例的redo logs文件。使用LogMiner分析其他数据库实例时,有几点需要注意:
1. LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。
2. 被分析数据库平台必须和当前LogMiner所在数据库平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle 8i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行LogMiner,而不能在其他如Microsoft NT上运行LogMiner。当然两者的硬件条件不一定要求完全一样。
3. LogMiner日志分析工具仅能够分析Oracle 8以后的产品,对于8以前的产品,该工具也无能为力。
五、结语
LogMiner对于数据库管理员(DBA)来讲是个功能非常强大的工具,也是在日常工作中经常要用到的一个工具,借助于该工具,可以得到大量的关于数据库活动的信息。其中一个最重要的用途就是不用全部恢复数据库就可以恢复数据库的某个变化。另外,该工具还可用来监视或者审计用户的活动,如你可以利用LogMiner工具察看谁曾经修改了那些数据以及这些数据在修改前的状态。我们也可以借助于该工具分析任何Oracle 8及其以后版本产生的重作日志文件。另外该工具还有一个非常重要的特点就是可以分析其他数据库的日志文件。总之,该工具对于数据库管理员来讲,是一个非常有效的工具,深刻理解及熟练掌握该工具,对于每一个数据库管理员的实际工作是非常有帮助的。
?
六、举例
?SQL> @E:oracleora92rdbmsadmindbmslm.sql
?
程序包已创建。
?
授权成功。
?
SQL> @E:oracleora92rdbmsadmindbmslmd.sql
?
过程已创建。
?
没有错误。
?
授权成功。
?
PL/SQL 过程已成功完成。
?
程序包已创建。
SQL> exec dbms_logmnr_d.build('wsrz.ora','e:oracle');
?
PL/SQL 过程已成功完成。
?
SQL> exec dbms_logmnr.add_logfile('&log_file',dbms_logmnr.new);
输入 log_file 的值:? E:oracleora92rdbmsARC00037.001
?
PL/SQL 过程已成功完成。
?
SQL> select low_time,high_time from? v$logmnr_logs;
?
LOW_TIME?? HIGH_TIME???????????????????????????????????????????????????????????
---------- ----------??????????????????????????????????????????????????????????
22-8月 -07 23-8月 -07??????????????????????????????????????????????????????????
?
SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';
?
会话已更改。
?
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'e:oraclewsrz.ora');
?
PL/SQL 过程已成功完成。
?
SQL> select sql_redo,TIMESTAMP from v$logmnr_contents
? 2? where upper(sql_redo) like '%delete%';
?
未选定行
?
SQL> select sql_redo,TIMESTAMP from v$logmnr_contents
? 2? where upper(sql_redo) like '%update%';
?
SQL> exec dbms_logmnr.end_logmnr;
?
PL/SQL 过程已成功完成。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!