1.flash query
需要有flashback any table的系统权限或者是该表的flashback对象权限。
需要有该表的SELECT, INSERT, DELETE, ALTER权限
必须保证该表ROW MOVEMENT
A.drop table:
在普通用户下使用 flashback table test to before drop;
但是在sys下面会报错ORA-38305: object not in RECYCLE BIN
如果删除一个表,而不想放到回收站中,可以利用purge选项在drop语句中,如
drop table tablename purge
另外,还有一些需要注意的地方
·drop tablespace tsname including contents时,表空间内的所有对象包括回收站内的对象都将被清除。
·只执行drop tablespace,如果有永久对象将不能执行,如果仅仅是有回收站内的对象,将先清除回收站,然后删除表空间
·如果drop user username cascade时,所有对象将被删除,而且不放入回收站
B.delete/update/insert:
可以使用下列语句查询历史数据,但是超过undo_retention(默认15分钟)的时候就不一定能查到:
SELECT * FROM test AS OF TIMESTAMP
TO_TIMESTAMP('2009-01-9 09:00:00', 'YYYY-MM-DD HH:MI:SS')WHERE XXX
但是作了truncate等DDL操作用上面的查询就,不能用闪回了
会报ORA-01466: 无法读取数据 - 表定义已更改
执行FLASHBACK TABLE XXXXXXXXXX的时候必须先
alter table test enable ROW MOVEMENT
然后
FLASHBACK TABLE test TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')
多个表都需要flash back就可以
FLASHBACK TABLE test,test1,test2 TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')
10g的flashback table有如下特性
· 在线操作
· 恢复到指定时间点或者SCN的任何数据.
· 自动恢复相关属性,如索引,触发器等
· 满足分布式的一致性
· 满足数据一致性,所有相关对象将自动一致
语法为:
FLASHBACK TABLE test TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')
FLASHBACK TABLE test TO SCN 123456;
FLASHBACK TABLE test TO TIMESTAMP '2009-01-08 19:37:15' ENABLE TRIGGERS;
其中ENABLE TRIGGERS表示触发器恢复之后为enable状态,而默认为disable状态。
以上的都是可以在线作,因为它使用的undo里面的数据。
C.truncate table 不能恢复,其他对象比如package等就需要flash database了
D.其他操作:
a.
select versions_starttime,versions_endtime, versions_xid,versions_operation
from test versions
between timestamp minvalue and maxvalue
order by versions_starttime
在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是伪列,
还有一些伪列,如versions_startscn和versions_endscn显示了该时刻的系统更改号。列versions_xid显示了更改该行的事务标识符
b.某一段时间内的操作
select dummy,versions_starttime,versions_endtime, versions_xid,versions_operation from test
versions between timestamp to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss') and to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss')
2.Flashback Transaction Query:
select * from FLASHBACK_TRANSACTION_QUERY
必须在SYS用户下执行
里面查询的是undo的SQL,比如删除了一笔数据,里面的就是插入数据的SQL,如果知道v$transaction的xid就可以查到这条undo SQL
3.flash database:
数据不要超过db_flashback_retention_target(默认一天),否则就有可能救不回来。
使用的回闪区域,所以,与下列的参数有关系
db_recovery_file_dest = /oracle/compard/flashbackarea
db_recovery_file_dest_size = 2G
db_flashback_retention_target = 1440
这些参数要事先设置好,否则mount下执行flashback on的时候,会报错误:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.
在mount状态下,确认数据库开启到archivelog模式,打开回闪,指令如下:
alter database flashback on;
用下列指令确认数据库是否开启在闪回模式下
select flashback_on from v$database;
如果发现数据库出问题,需要回闪,就可以使用下列指令,将整个数据库回闪到过去某个时刻。
flashback database to timestamp TO_TIMESTAMP('2008-01-08 19:46:15', 'YYYY-MM-DD HH24:MI:SS');
alter database open read only;
看看是否正确,如果不正确,可以退到mount下继续闪回
如果确认恢复的是正确的就是用这条SQL,把数据库打开alter database open resetlogs;
试了一下,依次执行下面的这三条SQL都可以成功:
flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:00:15', 'YYYY-MM-DD HH24:MI:SS');
flashback database to timestamp TO_TIMESTAMP('2008-01-14 09:58:34', 'YYYY-MM-DD HH24:MI:SS');
flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:07:15', 'YYYY-MM-DD HH24:MI:SS');