学无止境
分类: 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