Flashback功能介绍
1, Flashback常用的原理有三种,UNDO,回收站,闪回日志.
a,闪回表行记录:UNDO,闪回查询,闪回版本查询,闪回事务查询,及闪回表全部使用UNDO.
b,闪回drop的表:回收站,如果回收站被清空,则无法闪回.
c,闪回数据库:闪回日志,仅仅闪回数据库时才使用闪回日志.
2, Flashback开启
a, 不是一定要将数据库开启flashback才能使用基于回收站和UNDO的闪回功能;
b, 哪怕数据库没有开启归档,也没有开启闪回,前面这两种闪回同样可以使用.
Flashback使用举例
1, Flashback查询,使用关键字as of scn/timestamp
可以查询过去时间点的表记录,必要时可以将过去的时间点的表结果导出来,再重新导入至数据库,如下例子:
SQL>select * from join3 order by 1;
ID CONTENT
------- --------------------
1 txt1
2 txt2
3 txt3
4 txt4
5 txt5
SQL>select * from join3 as of timestamp to_timestamp('2012-06-29 16:50:00','yyyy-mm-dd hh24:mi:ss') order by 1;
ID CONTENT
------- --------------------
1 txt1
2 txt2
3 txt3
5 txt5
第4条记录是插入进去的!
2, Flashback版本查询,Flashback事务查询.
事务查询是在版本查询的基础上进行的,通过版本查询,获取事务号;再通过事务查询UNDO_SQL,可以进行UNDO.
SQL>select versions_xid,versions_starttime,versions_endtime,versions_operation from join3 versions between
timestamp minvalue and maxvalue;
VERSIONS_XID VERSIONS_STARTTIME VERSIONS_ENDTIME V
-------------------- ------------------------------ ------------------------------ -
09002F0048070000 29-JUN-12 04.52.14 PM I
SQL>select xid,start_scn,COMMIT_SCN,UNDO_SQL from flashback_transaction_query where xid=hextoraw('09002F0048070000');
XID START_SCN COMMIT_SCN UNDO_SQL
---------------- ---------- ---------- ----------------------------------------------------------------------
09002F0048070000 5607553 5607661 delete from "HR"."JOIN3" where ROWID = 'AAANCRAAEAAAAKUAAB';
09002F0048070000 5607553 5607661
3, Flashback表
在前面三个查询基础上,可以确定需要闪回的时间戳,或者scn,将表闪回,步骤:
a, 开启表的行移动,使得rowid可以变化.
SQL>alter table 表名 enable row movement;
b, 闪回表
SQL>flashback table 表名 to timestamp to_timestamp('2012-06-29 17:00:00','yyyy-mm-dd hh24:mi:ss');
SQL>flashback table 表名 to scn5607553;
4, Flashback drop表
SQL>flashback table 表名 to before drop [rename to 新表名];
5, Flashback database
Flashback遇到的问题
当过一段时间,flashback版本查询不能查询到事务的版本信息了,但如果记住了之前的事务版本号,则可以依旧可以从flashback_transaction_query
中查到该UNDO_SQL,为什么?
SQL>select versions_xid,versions_starttime,versions_endtime,versions_operation from join3 versions between timestamp minvalue and maxvalue;
VERSIONS_XID VERSIONS_STARTTIME VERSIONS_ENDTIME V ID CONTENT
-------------------- ------------------------------ ------------------------------ - ---------- --------------------
3 txt3
4 txt4
5 TXT5
6 txt6
1 txt1
2 txt2
6 rows selected.//这里已经无法查询到版本信息,但如果记得之前的XID,则下面的事务查询已经可以查询到UNDO_SQL,但XID必须从版本查询中获取.
SQL>select xid,start_scn,COMMIT_SCN,UNDO_SQL from flashback_transaction_query where xid='09002F0048070000';
XID START_SCN COMMIT_SCN UNDO_SQL
---------------- ---------- ---------- ----------------------------------------------------------------------
09002F0048070000 5607553 5607661 delete from "HR"."JOIN3" where ROWID = 'AAANCRAAEAAAAKUAAB';
09002F0048070000 5607553 5607661
请问这里的版本查询信息,存在哪里?为什么时间久了查询不到?
Flashback相关视图
1,V$FLASHBACK_DATABASE_LOG
select * from V$FLASHBACK_DATABASE_LOG
2,V$FLASHBACK_DATABASE_STAT
SELECT begin_time, end_time, flashback_data, db_data,
redo_data, estimated_flashback_size AS EST_FB_SZE
FROM V$FLASHBACK_DATABASE_STAT
3,闪回区域空间使用视图v$recovery_file_dest
SELECT name, space_limit AS quota,
space_used AS used,
space_reclaimable AS reclaimable,
number_of_files AS files
FROM v$recovery_file_dest