Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255537
  • 博文数量: 91
  • 博客积分: 2016
  • 博客等级: 大尉
  • 技术积分: 820
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-08 23:25
文章分类

全部博文(91)

文章存档

2011年(6)

2010年(6)

2009年(34)

2008年(45)

我的朋友

分类: Oracle

2009-07-14 23:10:49

logmnr可以对用户发出的sql语句进行跟踪,例如由于某个管理员修改数据时错误地把张三的工资修改了,这时使用logmnr可以知道张三的工资在修改前的值和修改后的值。通过logmnr可以把张三的工资恢复到修改前的状态。
安装LogMiner:
1. $oracle_home/rdbms/admin/dbmslm.sql --用来创建dbms_logmnr包,该包分析日志文件
   $oracle_home/rdbms/admin/dbmslmd.sql --用来创建dbms_logmnr_d包,创建数据字典文件
在运行这两个脚本的时候要以sys用户身份运行。


LogMiner使用产生日志文件的服务器来分析重做日志文件,重做日志文件来自当前数据库

LogMiner不解释重做日志的DDL语句,如drop table这样的ddl语句
LogMiner将不会重构原始的无日志的sql操作,如果在数据字典上的DML操作结果将被记录到日志文件里
使用LogMiner分析庞大数据的重做信息,是一件非常耗费时间的事情
无论源数据还是被分析的数据库都必须同时使用相同的操作硬件平台系统,都必须使用相同的字符集
LogMiner将显示未提交的事务,因为重做日志包含提交的和未提交的数据。


LogMiner分析重做日志文件的操作:
 1. 使用LogMiner存储过程创建一个外部数据字典文件
 2. 然后使用另一个存储过程创建一个被分析的重做文件的列表
 3. 最后执行另一个存储过程来启动LogMiner

LogMiner重要的过程和视图
 过程    
dbms_logmnr_d.build  创建一个数据字典文件
dbms_logmnr.add_logfile  在列表中增加日志文件以供分析
dbms_logmnr.start_logmnr 使用一个个可选的字典文件和前面确定要分析的日志文件来启动LogMiner
dbms_logmnr.end_logmnr  停止LogMiner分析

 视图
v$logmnr_dictionary  显示用来决定对象ID名称的字典文件的信息
v$logmnr_logs  在LogMiner启动时显示被分析的日志列表
v$logmnr_contents LogMiner启动后,可以使用这个视图在sql提示符下输入sql语句来查询重做日志的内容


执行任务:
1. 创建数据字典:
 产生确定数据字典的重要性:LogMiner将使用这个文件将对象标识转化成一个为意义的名字,它的信息保存到PGA内存区,应该确保系统必须有足够的内存空间,因为这种操作需要很大的内存,如果没有数据字典则需要较少的PGA内存空间。
 sql> execute dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location => 'c:\oracle\rman\ch10');

2. 产生数据库操作
 比如:对一个表进行增删查改的操作。
 这些操作语句的重做信息将被保存在当前联机重做日志文件中,可以从v$log视图里面找出日志seq号,然后进行一个强制日志切换,使当前联机日志归档,运行logMiner分析这个新归档的日志文件(如:102.arc是新归档的日志文件)。
 sql> select sequence# from v$log where status = 'CURRENT'
 sql> alter system switch logfile;
 
3. 为分析指定日志文件
 LogMiner将分析一个指定的日志文件,所以必须创建一个可供分析的日志文件列表。增加的日志文件将显示在v$logmnr_logs视图里
 sql> select db_name, thread_sqn,filename from v$logmnr_logs;
 前一个任务中sql所做的改变保存在序号为102的日志文件里,那么这里在logminer分析前添加这个日志文件和前面的两个文件
 begin
   dbms_logmnr.add_logfile(logfilename => '/oradata/dba/backup/ch10/100.arc', options => dbms_logmnr.NEW);
   dbms_logmnr.add_logfile(logfilename => '/oradata/dba/backup/ch10/101.arc', options => dbms_logmnr.ADDFILE);
   dbms_logmnr.add_logfile(logfilename => '/oradata/dba/backup/ch10/102.arc', options => dbms_logmnr.ADDFILE);
 end;
 /


 dbms_logmnr.new  --用于建一个日志分析表
 dbms_logmnr.addfile --用于加,入用于分析的日志文件
 dbms_logmnr.removefile --用于移出,用于分析的日志文件


 查看:sql> select db_name, thread_sqn,filename from v$logmnr_logs;
 可以删除里面的文件,如100.arc没有包含我们想要的信息,可以用REMOVEFILE选项来删除
 sql> execute dbms_logmnr.add_logfile(logfilename => 'd:\oradata\dba\archive\100.arc', option => dbms_logmnr.REMOVEFILE);

4. 启动LogMiner
 准备好字典文件和日志文件列表后,就可以准备启动LogMiner了
 execute dbms_logmnr.start_logmnr(dictfilename => 'c:\oracle\rman\ch10\dictionary.ora');
 可以指定分析开始的SCN和或结束的SCN,开始的时间和或结束时间。
 execute dbms_logmnr.start_logmnr(dictfilename => 'c:\oracle\rman\ch10\dictionary.ora',startime => to_date(20030501 12:12:00','yyyymmdd hh24:mi:ss'),endtime => to_date(20030501 14:20:00','yyyymmdd hh24:mi:ss'));

5. 分析日志文件内容
 检查数据库更改的细节:sql> select operation, timestamp,scn from v$logmnr_contents where seg_name = 'EMP' and seg_owner='SCOTT' and seg_type_name = 'TABLE';
         select sql_redo,sql_undo from v$logmnr_contents where seg_name='EMP' and seg_owner='SCOTT' and seg_type_name = 'TABLE';
         select usrnamen, session_info from logmnr_contents where seg_name = 'EMP' and seg_owner='SCOTT' and seg_type_name='TABLE';


 执行容量分析:使用LogMiner不会降低运行时间,而使用表审计则会导致运行时间性能开销过大
  

下面为分析数据库表上DML操作提供一些思路与方法:
  select operation, to_char(timestamp,'HH') hour,count(*) total from v$logmnr_contents where seg_name ='DATE_LOG' and seg_owner='TINA' and seg_type_name='TABLE' group by operation, to_char(timestamp,'HH');


 寻找DDL命令的细节:
 select seg_name,operation,scn,timestamp,count(*) from v$logmnr_contents where operation='DELETE' group by seg_name,operation,scn,timestamp order by scn;

6. 关闭LogMiner
 可以把v$logmnr_contents视图的内容创建一个永久的数据库表将非常有帮助
 sql> create table logmnr_contents as select * from v$logmnr_contents;
 当完成了重做日志的检查,运行dbms_logmnr 中的end_logmnr
 execute dbms_logmnr.end_logmnr();

阅读(1316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~