Flashback Version Query
SQL> conn /as sysdba
已连接。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
475124
SQL> conn u1/u1
已连接。
SQL> select * from t;
ID VALUE
---------- ----------
1 a
2 b
3 c
SQL> delete from t where id = 3;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID VALUE
---------- ----------
1 a
2 b
SQL> insert into t values(3,'d');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID VALUE
---------- ----------
1 a
2 b
3 d
SQL> update t set value = 'c' where id = 3;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID VALUE
---------- ----------
1 a
2 b
3 c
SQL> conn /as sysdba
已连接。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
475160
SQL> conn u1/u1
已连接。
SQL> select id,value,versions_startscn,versions_endscn,versions_operation,versions_xid from t versions between scn 475124 and 475160;
ID VALUE VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID
---------- ---------- ----------------- --------------- - ----------------
3 c 475152 U 0A002D00B5000000
3 d 475145 475152 I 08001300EB000000
3 c 475136 D 060015002E010000
1 a
2 b
3 c 475136
已选择6行。
Flashback Transaction Query
Flashback的事务查询功能与Flashback版本查询间关系密切,在上面例子中最后的示例查询中,有一个伪列VERSIONS_XID,虽然列举出来但没有具体介绍。其实该列正是Flashback事务查询与版本查询间的关联所在,通过VERSIONS_XID列显示的事务ID关联FLASHBACK_TRANSACTION_QUERY视图查询,能够获得这个事务执行时的很多信息,甚至包括UNDO语句。
SQL> select versions_xid from t versions between scn 475124 and 475160;
VERSIONS_XID
----------------
0A002D00B5000000
08001300EB000000
060015002E010000
SQL> conn /as sysdba
已连接。
SQL> select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query where xid in('0A002D00B5000000','08001300EB000000','060015002E010000');
XID COMMIT_SCN COMMIT_TIMESTAMP OPERATION UNDO_SQL
---------------- ---------- ------------------- -------------------------------- --------------------------------------------------------------------------------
060015002E010000 475136 2011-10-18 06:32:25 DELETE insert into "U1"."T"("ID","VALUE") values ('3','c');
060015002E010000 475136 2011-10-18 06:32:25 BEGIN
08001300EB000000 475145 2011-10-18 06:32:49 INSERT delete from "U1"."T" where ROWID = 'AAAMpBAAFAAAAAMAAD';
08001300EB000000 475145 2011-10-18 06:32:49 BEGIN
0A002D00B5000000 475152 2011-10-18 06:33:04 UPDATE update "U1"."T" set "VALUE" = 'd' where ROWID = 'AAAMpBAAFAAAAAMAAD';
0A002D00B5000000 475152 2011-10-18 06:33:04 BEGIN
已选择6行。
自动撤销管理表空间
要使用Flashback的相关特性,必须启用自动撤销管理表空间,不单单对于Flashback Query,也包括Flashback Table和Flashback Database,而对于后两项还会有些其他的附加条件,如Flashback Table需要启用了Recycle Bin(回收站),Flashback Database还要求必须启用了Flashback Area(闪回区)。
SQL> show parameter undo_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
undo_management:值为AUTO表示使用了自动撤销管理表空间,MANUAL则表示手动管理。
undo_retention:该参数用来指定UNDO段中数据保存的最短时间,以秒为单位,是一个动态参数,完全可以在实例运行时随时修改,通常默认是900秒,也就是15分钟。
undo_tablespace:undo表空间。