ORACLE LOGMNR简单而强大的工具

LOGMNR简单而强大的工具

在Oracle数据库中,LGWR进程将数据库中进行的DML等操作信息记录在日志文件中,在归档模式下,日志文件还会写出到归档日志文件中。在数据库发生故障崩溃后,恢复时数据库可以根据日志信息来重演事务,完成恢复,从而保证成功提交的事务不丢失。

很多第三方工具以及Oracle的一些工作,都可以通过解析日志文件来实现数据复制和同步。Oracle随数据库软件提供了一个LOGMNR工具,可以很容易实现对于日志的解析,熟悉LOGMNR的使用在很多时候可以帮助我们分析数据库问题,找出根本原因。

从Oracle9i开始,LOGMNR的使用大大简化,可以使用LOGMNR在线分析和挖掘日志,使用当前在线的数据字典,非常方便,以下是一个简要的测试和说明。

首先执行一个ddl(或dml)操作,以记录重做信息:

 
 
  1. SQL> connect eygle/eygle  
  2. Connected.  
  3. SQL> alter system switch logfile;  
  4. System altered.  
  5. SQL> create table eygle as select * from dba_users;  
  6. Table created.  
  7. SQL> select count(*) from eygle;  
  8.   COUNT(*)  
  9. ----------  
  10.         19 

然后可以执行LOGMNR解析工作:

 
 
  1. SQL> connect / as sysdba  
  2. Connected.  
  3. SQL> select * from v$log where status='CURRENT';  
  4. GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC  
  5. STATUS   FIRST_CHANGE# FIRST_TIME  
  6. ---------- ---------- ---------- ---------- ----------  ---  
  7. ----------------    -------------  
  8.      2          1        100   52428800          1 NO     
  9. CURRENT      12729697   01-JUL-09  
  10. SQL> SELECT MEMBER from v$logfile where group#=2;  
  11. MEMBER  
  12. ------------------------------------------------------------  
  13. ----------------------------  
  14. /opt/oracle/oradata/mmstest/redo02.log  
  15. SQL>exec 
  16. dbms_logmnr.add_logfile('/opt/oracle/oradata/mmstest/redo02.  
  17. log',dbms_logmnr.new);  
  18. PL/SQL procedure successfully completed.  
  19. SQL> exec 
  20. dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_onli  
  21. ne_catalog);  
  22. PL/SQL procedure successfully completed.  
  23. SQL> select count(*) from v$logmnr_contents;  
  24.   COUNT(*)  
  25. ----------  
  26.        136 

解析之后,就可以通过V$LOGMNR_CONTENTS视图来查出数据库执行所有操作,以下是查询出来的SQL_REDO,通过这些SQL就可以重演CREATE TABLE的ddl操作,通过以下的重做信息也可以看到,ddl的后台操作实际上是转换为对字典表的一系列dml操作。

 
 
  1. SQL> select sql_redo from v$logmnr_contents;  
  2. SQL_REDO  
  3. ------------------------------------------------- 

 
 
  1. set transaction read write;  
  2. insert into 
  3. "SYS"."OBJ$"("OBJ#","DATAOBJ#","OWNER#","NAME","NAMESPACE","  
  4. SUBNAME",  
  5. "TYPE#","CTIME","MTIME","STIME","STATUS","REMOTEOWNER","LINK  
  6. NAME","FLAGS","OID$","SPARE1","SPARE2","SPARE3","SPARE4","SP  
  7. ARE5","SPARE6") values ('25847','25847','31','EYGLE',  
  8. '1',NULL,'2',TO_DATE('01-JUL-09','DD-MON-RR'),TO_DATE('01-JU  
  9. L-09','DD-MON-RR'),TO_DATE('01-JUL-09',  
  10. 'DD-MON-RR'),'1',NULL,NULL,'0',NULL,'6','1',NULL,NULL,NULL,N  
  11. ULL);  
  12.  
  13. set transaction read write;  
  14. update "SYS"."CON$" set "CON#" = '10823' where "CON#" =  
  15. '10822' and ROWID = 'AAAAAcAABAAAACqAAM';  
  16. commit;  
  17. set transaction read write;  
  18. update "SYS"."CON$" set "CON#" = '10824' where "CON#" =  
  19. '10823' and ROWID = 'AAAAAcAABAAAACqAAM';  
  20. commit;  
  21. set transaction read write;  
  22. update "SYS"."CON$" set "CON#" = '10825' where "CON#" =  
  23. '10824' and ROWID = 'AAAAAcAABAAAACqAAM';  
  24. commit;  
  25. set transaction read write;  
  26. update "SYS"."CON$" set "CON#" = '10826' where "CON#" =  
  27. '10825' and ROWID = 'AAAAAcAABAAAACqAAM';  
  28. commit;  
  29. set transaction read write;  
  30. update "SYS"."CON$" set "CON#" = '10827' where "CON#" =  
  31. '10826' and ROWID = 'AAAAAcAABAAAACqAAM';  
  32.  
  33. commit;  
  34. set transaction read write;  
  35. update "SYS"."CON$" set "CON#" = '10828' where "CON#" =  
  36. '10827' and ROWID = 'AAAAAcAABAAAACqAAM';  
  37.  
  38. commit;  
  39. set transaction read write;  
  40. update "SYS"."CON$" set "CON#" = '10829' where "CON#" =  
  41. '10828' and ROWID = 'AAAAAcAABAAAACqAAM';  
  42.  
  43. commit;  
  44. create table eygle as select * from dba_users;  
  45. set transaction read write; 

查询完成之后,可以通过如下命令结束日志解析过程:

 
 
  1. SQL> exec dbms_logmnr.end_logmnr  
  2. PL/SQL procedure successfully completed. 

熟悉和熟练使用LOGMNR可以帮助我们解决很多棘手的问题,并加深对于数据库的理解。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值