oracle 的flashback version query和logminer

有时候需要知道已经做过的DML的详细信息,比如说执行的语句,语句提交的时间点等,我们可以通过两种方式查询,logminer和version query。








做了如下操作

创建一个表

SCOTT@DCSSS > create table test_logmnr (id number, val varchar2(10));

Table created.

插入两个记录,要注意的是VALUE用的是大写字母,等下看看从logmnr中找回来的是大写还是小写。

SCOTT@DCSSS > insert into test_logmnr VALUES(1,'first');

1 row created.

SCOTT@DCSSS > insert into test_logmnr VALUES(2,'second');

1 row created.

SCOTT@DCSSS > commit;

Commit complete.

删除记录

SCOTT@DCSSS > delete from test_logmnr;

2 rows deleted.

SCOTT@DCSSS > commit;

Commit complete.

SCOTT@DCSSS >

现在操作完毕,先看一下logmnr的查询

用logminer要首先确定log,也就是你要用logminer去查看哪个log

SYS@DCSSS > select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1       7915  524288000          2 YES INACTIVE            1.1656E+12 19-JUN-12
         2          1       7916  524288000          2 YES INACTIVE            1.1656E+12 19-JUN-12
         3          1       7917  524288000          2 NO  CURRENT             1.1656E+12 19-JUN-12

SYS@DCSSS > select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                                                           IS_
---------- ------- ------- -------------------------------------------------------------------------------- ---
         3         ONLINE  /u11/oradata/DCSSS/redo03_1.rdo                                                  NO
         3         ONLINE  /u11/oradata/DCSSS/redo03_2.rdo                                                  NO
         2         ONLINE  /u11/oradata/DCSSS/redo02_1.rdo                                                  NO
         2         ONLINE  /u11/oradata/DCSSS/redo02_2.rdo                                                  NO
         1         ONLINE  /u11/oradata/DCSSS/redo01_1.rdo                                                  NO
         1         ONLINE  /u11/oradata/DCSSS/redo01_2.rdo                                                  NO

看上面的查询,发现当前的log,是group3,但不知道当时做操作的时候log应该是哪个。所以再做下面的查询

SYS@DCSSS > select group#,members,status,to_char(first_time,'YYYY-MM-DD HH24-MI-SS') from v$log;

    GROUP#    MEMBERS STATUS           TO_CHAR(FIRST_TIME,
---------- ---------- ---------------- -------------------
         1          2 INACTIVE         2012-06-19 07-36-46
         2          2 INACTIVE         2012-06-19 10-41-46
         3          2 CURRENT          2012-06-19 13-51-46

把date类型用to_char处理一下,就清晰很多了,这样根据时间可以知道,第三行的log就是需要的,再结合v$logfile,得到该log。

接下来,用logminer处理该log。 需要做的步骤是

1. 添加log

2.执行logminer进行分析

3.查询结果

下面逐步进行

1.添加log

SYS@DCSSS > exec dbms_logmnr.add_logfile( logfilename=>'/u11/oradata/DCSSS/redo03_1.rdo' , options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.

如果是第一个添加的log文件,options部分是dbms_logmnr.new。

如果是增加多个文件,从第二个开始,options部分是dbms_logmnr.addfile

2.执行logminer进行分析

SYS@DCSSS > exec dbms_logmnr.start_logmnr( options=>dbms_logmnr.dict_from_online_catalog);

PL/SQL procedure successfully completed.

注意,这里可以加上starttime 和 endtime参数,这样如果redo太大,我们可以只分析某个时间段

3.查询结果

查询结果要查询v$logmnr_contents

SYS@DCSSS > SELECT TO_CHAR(TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') AS TIME , USERNAME , SQL_REDO,TABLE_name FROM V$LOGMNR_CONTENTS WHERE USERNAME='SCOTT' and table_name='TEST_LOGMNR' ORDER BY TIME;

TIME                USERNAME   SQL_REDO                                                                         TABLE_NAME
------------------- ---------- -------------------------------------------------------------------------------- ---------------
2012-06-19 15:00:41 SCOTT      create table test_logmnr (id number, val varchar2(10));                          TEST_LOGMNR
2012-06-19 15:01:52 SCOTT      insert into "SCOTT"."TEST_LOGMNR"("ID","VAL") values ('1','first');              TEST_LOGMNR
2012-06-19 15:02:10 SCOTT      insert into "SCOTT"."TEST_LOGMNR"("ID","VAL") values ('2','second');             TEST_LOGMNR
2012-06-19 15:02:25 SCOTT      delete from "SCOTT"."TEST_LOGMNR" where "ID" = '1' and "VAL" = 'first' and ROWID TEST_LOGMNR
                                = 'AABPSQAANAAAOY0AAA';

2012-06-19 15:02:25 SCOTT      delete from "SCOTT"."TEST_LOGMNR" where "ID" = '2' and "VAL" = 'second' and ROWI TEST_LOGMNR
                               D = 'AABPSQAANAAAOY0AAB';


上面是通过 logminer来查看,如果想快速的查看,可以通过flashback version query来查询。原理就是查询undo数据,但是一个db的undo保存期限是有一定时间的,而且undo的空间也有限,所以这种情况下,有可能因为时间太久等查不到,具体查询如下。

1. 对test_logmnr 执行一个DML

SYS@DCSSS > INSERT INTO SCOTT.TEST_LOGMNR VALUES(9,'NINE');

1 row created.

SYS@DCSSS > COMMIT;

Commit complete.


2. 进行version query

SYS@DCSSS > SELECT ID,VAL,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION FROM SCOTT.TEST_LOGMNR
  2  VERSIONS BETWEEN TIMESTAMP
  3  TO_TIMESTAMP('2012-06-19 16:59:00','YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2012-06-19 17:00:00','YYYY-MM-DD HH24:MI:SS')
  4  ORDER BY VERSIONS_STARTTIME
  5  /

        ID VAL        VERSIONS_STARTTIME                       VERSIONS_ENDTIME                         VERSIONS_OPERATION
---------- ---------- ---------------------------------------- ---------------------------------------- ----------------------------------------
         9 NINE       19-JUN-12 04.59.29 PM                                                             I
         8 eight



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值