FLASHBACK 技术包括多个方面:flashback database,flashback drop,flashback query,flashback table
其中flashbackdatabase利用的是闪回日志,flashback drop利用的回收站,flashback query 和 flashbacktable 利用的是undo信息。Flashbackquery可以帮助我们确定在过去某个时间点或者时间段内表的数据是如何存储的,而flashback table则是帮助我们切切实实的将表闪回到过去的某个时间点。
Flashback query 是在oracle 9i时引入的的,为的是帮助我们查询在过去某个时间点某表的数据状态。语法格式为
Select * from table_name as of scnscn;
Select * from table_name as oftimestamp timestamp;
由于flashbackquery只可以查询过去某个时间点的信息,无法针对某一个时间段进行查询,因此在10g中,oracle引入了flashbackversion query,语法格式如下:
Select versions_xid,versions_startscn,versions_endscn,versions_starttime,versions_endtime,….From table_name versions between scn startscn and endscn;
Select versions_xid,versions_startscn,versions_endscn,versions_starttime,versions_endtime,….From table_name versions between scn minvalue and maxvalue;
Select versions_xid,versions_startscn,versions_endscn,versions_starttime,versions_endtime,….From table_name versions between timstamp starttime and endtime;
需要注意的是,flashback version query不可以跨越ddl执行
除了flashbackversion query 外,oracle还为我们提供了flashback transaction query,通过 flashback transaction query 我们可以针对某一事务语句进行查询,获悉该事务所影响的表数据。语法格式如下:
Select * from flashback_transaction_query where xid = ??;
Flashback table 可以将表闪回的之前的某个状态,语法格式如下:
Flashbacktable table_name to scn scn;
Flashbacktable table_name to timestamp timestamp;
需要注意的是flashback table 同样不可以跨越ddl,但是如果我们仅仅是对表执行了添加列的ddl操作,那么我们是可以闪回到ddl之前的某个状态的,只是新添加的列取值全部为空。
Flashback table操作是通过临时表对需要闪回的表进行了删除和插入操作(删除所有数据并重新插入所有数据),因此可能发生行的位置改变。