Chinaunix首页 | 论坛 | 博客
  • 博客访问: 898503
  • 博文数量: 206
  • 博客积分: 10276
  • 博客等级: 上将
  • 技术积分: 2358
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-01 02:41
文章分类

全部博文(206)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(10)

2010年(14)

2009年(15)

2008年(33)

2007年(90)

2006年(40)

我的朋友

分类: Oracle

2010-12-02 09:24:15

Logmnr在Oracle 9i以后做了众多的改进,如可以不需要build flat文本文件就可以分析日志了,也就表示可以不需要修改参数utl_file_dir就可以分析日志了,避免了修改参数utl_file_dir导致的重起数据库问题。另外也开始支持把字典信息build到联机日志中,在异地分析归档日志。

在flashback也不能帮上忙的时候,logmnr却是非常有用的。因为只要误操作时期的归档日志存在,就可以通过归档日志来恢复误删除(delete)的数据。

如果在Oracle 9i以上,采用在本地的在线数据字典分析归档日志,就这么简单:

  1. Piner@9iR2>exec -
  2.            sys.dbms_logmnr.add_logfile(LogFileName=>'/archive_log/archive/1_9.arc',-
  3.            options => dbms_logmnr.new);
  4. PL/SQL procedure successfully completed.
  5. Piner@9iR2>exec sys.dbms_logmnr.start_logmnr( -
  6.            Options => sys.dbms_logmnr.dict_from_online_catalog);
  7. PL/SQL procedure successfully completed.

可以看到,在线分析其实就只需要这两步,添加日志并分析日志。注意以上OPTIONS => DBMS_LOGMNR.NEW,表示添加第一个日志,如需要另外添加更多的日志,可以用如下方式即可。

  1. Piner@9iR2>exec sys.dbms_logmnr.add_logfile(LogFileName=>'/archive_log/archive/1_10.arc');

如果日志分析完成,可以把需要的信息保存到临时表,如

  1. Piner@9iR2>create table tmp_logmnr as
  2.      2  select operation,sql_redo,sql_undo from v$logmnr_contents
  3.      3  where seg_name='TEST';

然后,终止日志分析过程。

  1. Piner@9iR2>exec sys.dbms_logmnr.end_logmnr

对于临时表中的SQL_UNDO,可以选择性的恢复,如采用如下的脚本来恢复,这里为了减少阻塞,每1000条提交一次。另外,需要注意的是,SQL_UNDO中的分号,如果想用动态SQL来执行的话,是需要去掉的。

  1. declare
  2.   mysql varchar2(4000);
  3.   num number :=0;
  4. begin
  5.   for c_tmp in (select sql_undo from tmp_logmnr where operation = 'DELETE') loop
  6.   --去掉语句中的分号,这里假定只有语句结尾有分号,语句中间并没有分号。
  7.   --如果语句中也有分号,则可以考虑替换语句结尾的;'(分号单引号)为'(单引号)。
  8.     mysql := replace(c_tmp.sql_undo,';','');
  9.     execute immediate mysql;
  10.     num := num + 1;
  11.     if mod(num,1000)=0 then
  12.       commit;
  13.     end if;
  14.   end loop;
  15.   commit;
  16. exception
  17.   when others then
  18.    --异常处理
  19. end;
  20. /

以上的PL/SQL代码其实还可以加强,如恢复成功一条,就设置状态值为1,否则,设置状态值为-1,方便跟踪那些记录恢复成功,哪些记录恢复失败了。

另外,需要注意的是,在Oracle 10g以下,LOGMNR的临时表v$logmnr_contents,使用的是system表空间,在Oracle 10g以后改为sysaux表空间。可以使用如下的命令,更改logmnr的特定表空间,防止system表空间出现空间不够。

  1. Piner@9iR2>exec  sys.dbms_logmnr_d.set_tablespace('USERS');
阅读(1937) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

qpengf2011-01-25 14:09:27

不错

chinaunix网友2010-12-02 14:34:57

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com