Snowfun

导航

 

Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。
一、闪回查询

a.基本闪回查询
功能描述:可以查询过去某个时间段的数据库状态。
工作原理:Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。

--查看表历史时刻数据
select * from  CX_SALES as of timestamp to_timestamp('2017-06-14 10:50:00','yyyy-mm-dd hh24:mi:ss');
--查看过去某一段时间内对表的操作,以确认需要恢复到的时间点
select LAST_ACTIVE_TIME,SQL_TEXT from v$sqlarea where LAST_ACTIVE_TIME >to_date('20170601 01:00:00','yyyymmdd hh24:mi:ss') and SQL_TEXT like '%CX_SALES%'

b.闪回表
功能描述:可将某个表回退到过去某个时间点
工作原理:同样,Oracle会先去查询撤销段,提取过去某个时间点之后的所有变更,构造反转这些变更的SQL语句进行回退,闪回操作是一个单独的事务,所以若由于撤销数据过期之类的原因导致无法闪回,整个操作会回滚,不会存在不一致的状态。
步骤:

利用flashback table恢复表到过去某一时刻
--1.启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了)
alter table CX_SALES enable row movement; 
--2.闪回表操作
flashback table CX_SALES to timestamp ('20170917 10:00:00','yyyymmdd hh24:mi:ss');
--3.
alter table CX_SALES disable row movement; 

闪回表可能会失败,有可能有以下几种情况:
违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表操作失败了;
撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败;
闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,这种情况闪回操作也会失败。
注意:上述闪回功能都是基于撤销数据的,而撤销数据是会被重写的(Expired会被重写,Active不会被重写),所以,在需要使用这几种闪回功能去恢复数据的时候(确切地说,是需要使用基于撤销数据的闪回功能时),最短时间发现错误,第一时间执行闪回操作,才能最大程度地保证闪回功能的成功。


二、闪回删除
三、闪回归档
功能描述:闪回数据归档可使表具有回退到过去任何时间点的能力,前面提到的闪回查询,闪回表都会受限于撤销数据是否失效,如果撤销数据被覆盖重写了,闪回操作自然会失败,闪回删除则受限于表空间是否有足够可用空间,而闪回数据归档,则没有这些限制。

创建闪回归档
--1.创建一个用户闪回数据归档的表空间,当然,也可以使用已经存在的表空间。
create tablespace FlashbackData  datafile '/home/oracle/oradata/uatdb/FlashbackData.dbf' size 20m; 
--2.创建一个保留时间为2年的闪回归档
create flashback archive FlashbackArchive tablespace FlashbackData retention 2 year;

为用户SIEBEL下的CX_SALES启动闪回归档
--3.赋予用户SIEBEL归档的权限
grant flashback archive on FlashbackArchive to SIEBEL;
--4. 为siebel用户下的CX_SALES表启用闪回归档
alter table CX_SALES flashback archive FlashbackArchive;
--至此,CX_SALES表就拥有了可以查询或回退到过去2年任意时间点的能力

select LAST_ACTIVE_TIME,SQL_TEXT from v$sqlarea 
where LAST_ACTIVE_TIME >to_date('20170601 01:00:00','yyyymmdd hh24:mi:ss') and SQL_TEXT like '%CX_SALES%'

 


四、闪回数据库

转http://www.cnblogs.com/chengxiao/p/5860823.html

其他注意:
1.当闪回删除操作之前,如果某个键值如主键被重用,将导致违反主键约束,闪回失败。
2.若闪回所需要的UNDO信息不存在,将引发ORA-08180:no snapshot found based on specified time(未找到基于指定时间的快照)错误
3.如果受闪回影响的记录被其它用户锁定,将引发ORA-00054:resource busy and acquire with NOWAIT specified (资源忙碌)错误
4.表定义在闪回期间不能发生变化,否则导致ORA-01466:unable to read data - table definition has changed(表定义已变化)错误
5.闪回前未启用row movement,将收到ORA-08189: cannot flashback the table because row movement is not enabled 错误
6.对于存在参照关系的情况,建议将主表等一起实施闪回,否则,将收到ORA-02091: transaction rolled back,ORA-02291错误
7.SYS 模式中的表不能使用表闪回技术

posted on 2017-06-15 18:42  Snowfun  阅读(353)  评论(0)    收藏  举报