Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1117926
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: Oracle

2013-09-18 11:06:38

闪回查询特性是使用了自动UNDO管理机制,基于UNDO中的数据,对元数据和事务的历史数据进行获取。
 
分配用于闪回查询的权限:
分配闪回权限给用户,角色,或应用程序等用于使用闪回特性如下:
分配DBMS_FLASHBACK包的执行权限,可以使用该包中的特性,通过该包,可以使用ORACLE内部时间机制设置相应的时间点等。
对于闪回查询和闪回版本查询,需要分配指定对象的FLASHBACK和SELECT权限,或者是分配FLASHBACK ANY TABLE权限,允许查询所有表。
对于闪回事务查询,需要分配SELECT ANY TRANSACTION的权限。
对于执行撤销SQL代码,需要分配指定表的SELECT,UPDATE,DELETE,INSERT权限,在适当时,允许闪回事务查询执行撤销SQL代码。
 
闪回查询主要包括:
1.使用DBMS_FLASHBACK包
2.闪回查询
3.闪回版本查询
4.闪回事务查询
 
其他闪回包括:
1.闪回表
2.闪回DROP
3.闪回数据库
这3种闪回是基于其他恢复机制。
 
闪回查询的权限分配:
对于用户自己的表,是有闪回权限的,对于其他用户需要分配闪回权限
 
GRANT FLASHBACK ON SCOTT.BONUS_DROP TO test;
GRANT FLASHBACK ANY TABLE to test
GRANT EXECUTE ON DBMS_FLASHBACK to test;
grant SELECT ANY TRANSACTION to test;
 
闪回查询的方法:
1.使用DBMS_FLASHBACK包
  使用该包,可以再当前会话中开启闪回模式,会话可以直接查询到某个SCN号的数据情况,启动闪回模式只对当前会话有效,还可以关闭闪回模式,回到正常状态。
  该包中主要的存储过程如下:
  DISABLE                              在整个会话里关闭闪回模式
  ENABLE_AT_SYSTEM_CHANGE_NUMBER       在整个会话里开启闪回模式,设置所有查询返回的数据都基于该设置的SCN
  ENABLE_AT_TIME                       在整个会话里开启闪回模式,设置快照时间最接近于指定的时间值
  GET_SYSTEM_CHANGE_NUMBER             获取当前SCN值
  SCN_TO_TIMESTAMP                     转换SCN为TIMESTAMP
  TIMESTAMP_TO_SCN                     转换TIMESTAMP为SCN
 
  例如:
  SQL> select * from tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
 
  SQL> select timestamp_to_scn(sysdate) from dual;
 
  TIMESTAMP_TO_SCN(SYSDATE)
  -------------------------
                   26657029
  SQL> insert into tab1 values(12,'addname');
 
  已创建 1 行。
 
  SQL> commit;
 
  提交完成。
 
  SQL> select * from tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
          12 addname
 
  SQL> exec DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(26657029);
  PL/SQL 过程已成功完成。
 
  SQL> select * from tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
 
  SQL> exec DBMS_FLASHBACK.DISABLE;
 
  PL/SQL 过程已成功完成。
 
  SQL> select * from tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
          12 addname
 
 
2.闪回查询
  闪回查询可以使用SCN,也可以使用TIMESTAMP。查询之前某一个时间点的表数据情况。
  SQL> select * from tab1 as of SCN 26657029;
          ID NAME
  ---------- --------------------
          10 eagle
 
  SQL> SELECT * FROM tab1 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);
 
          ID NAME
  ---------- --------------------
          10 eagle
 
3.闪回版本查询
  闪回版本查询可以获得表中的列,在一定时间区间内,发生的变化
  闪回版本查询中的一些伪列:
  VERSIONS_STARTSCN
  VERSIONS_STARTTIME
  当行版本被创建时的SCN号或时间点,如果为NULL,则该行版本的创建时间不在查询语句的BETWEEN区间
 
  VERSIONS_ENDSCN
  VERSIONS_ENDTIME
  当行版本到期时的SCN号或时间点,如果为NULL,则该行版本的结束时间不在查询语句的BETWEEN区间
 
  VERSIONS_XID
  标记创建该行版本的事务
 
  VERSIONS_OPERATION
  该事务的操作,I表示INSERT,U表示UPDATE,D表示DELETE
 
  例子:
  SQL> SELECT * FROM tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
          12 gaga
 
  SQL> select timestamp_to_scn(sysdate) from dual;
 
  TIMESTAMP_TO_SCN(SYSDATE)
  -------------------------
                   26666603
 
  SQL> update tab1 set name='polo' where id=12;
  已更新 1 行。
 
  SQL> commit;
 
  提交完成。
 
  SQL> update tab1 set name='yake' where id=12;
 
  已更新 1 行。
 
  SQL> commit;
 
  提交完成。
 
  SQL> update tab1 set name='poly' where id=12;
 
  已更新 1 行。
 
  SQL> commit;
 
  提交完成。
 
  SQL> SELECT * FROM tab1;
 
          ID NAME
  ---------- --------------------
          10 eagle
          12 poly
 
  SQL> select timestamp_to_scn(sysdate) from dual;
 
  TIMESTAMP_TO_SCN(SYSDATE)
  -------------------------
                   26667442
                
  SQL> SELECT versions_starttime,
    2         versions_endtime,
    3         versions_xid, versions_operation,
    4         id, name
    5    FROM tab1
    6    VERSIONS BETWEEN SCN
    7        26666603
    8    AND 26667442
    9    WHERE id = 12;
 
  VERSIONS_STARTTIME             VERSIONS_ENDTIME               VERSIONS_XID     V         ID NAME
  ------------------------------ ------------------------------ ---------------- - ---------- --------------------
  21-Nov-12 05.06.55 PM                                         050027000F7F0000 U         12 poly
  21-Nov-12 05.06.43 PM         21-Nov-12 05.06.55 PM           03002800FD7E0000 U         12 yake
  21-Nov-12 05.06.34 PM         21-Nov-12 05.06.43 PM           050023000E7F0000 U         12 polo
                                21-Nov-12 05.06.34 PM                                      12 gaga
 
  SQL> SELECT versions_startscn,
    2         versions_endscn,
    3         versions_xid, versions_operation,
    4         id, name
    5    FROM tab1
    6    VERSIONS BETWEEN TIMESTAMP
    7        TO_TIMESTAMP('2012-11-21 17:06:00', 'YYYY-MM-DD HH24:MI:SS')
    8    AND TO_TIMESTAMP('2012-11-21 17:09:00', 'YYYY-MM-DD HH24:MI:SS')
    9    WHERE id = 12;
 
  VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID     V         ID NAME
  ----------------- --------------- ---------------- - ---------- --------------------
           26666969                 050027000F7F0000 U         12 poly
           26666838        26666969 03002800FD7E0000 U         12 yake
           26666761        26666838 050023000E7F0000 U         12 polo
                           26666761                            12 gaga
 
4.闪回事务查询
  通过查询FLASHBACK_TRANSACTION_QUERY视图,获取事务的闪回信息。查询该视图,需要有SELECT ANY TRANSACTION权限,如果分配SELECT权限,仍然会报权限不足的错误。
  通常可以和闪回版本查询结合起来,例如:
 
  SQL> SELECT  xid, start_scn, commit_scn,
    2  operation OP, logon_user,
    3  undo_sql FROM flashback_transaction_query
    4  WHERE xid = HEXTORAW('03002800FD7E0000');
 
  XID               START_SCN COMMIT_SCN OP       LOGON_USER UNDO_SQL
  ---------------- ---------- ---------- -------- ---------- --------------------------------------------------------------------------------
  03002800FD7E0000   26666819   26666838 UPDATE   TEST       update "TEST"."TAB1" set "NAME" = 'polo' where ROWID = 'AAANOsAAEAAAACPAAB';
  03002800FD7E0000   26666819   26666838 BEGIN    TEST
 
 
  SQL> SELECT xid, operation OP, logon_user,
    2  undo_sql FROM flashback_transaction_query
    3  WHERE xid IN (SELECT versions_xid FROM tab1 VERSIONS BETWEEN TIMESTAMP
    4  TO_TIMESTAMP('2012-11-22 10:20:00', 'YYYY-MM-DD HH24:MI:SS')
    5  AND TO_TIMESTAMP('2012-11-22 10:25:00', 'YYYY-MM-DD HH24:MI:SS'));
 
  XID              OP       LOGON_USER UNDO_SQL
  ---------------- -------- ---------- --------------------------------------------------------------------------------
  050019002A7F0000 INSERT   TEST       delete from "TEST"."TAB1" where ROWID = 'AAANOsAAEAAAACMAAA';
  050019002A7F0000 BEGIN    TEST
  010005005C800000 UPDATE   TEST       update "TEST"."TAB1" set "NAME" = 'poly' where ROWID = 'AAANOsAAEAAAACPAAB';
  010005005C800000 BEGIN    TEST
  07002C00E87E0000 DELETE   TEST       insert into "TEST"."TAB1"("ID","NAME") values ('10','eagle');
  07002C00E87E0000 BEGIN    TEST
 


 

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