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的事务查询功能与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表空间。