Flashback技术是以Undo segment中的内容为基础的,因此受限于UNDO_RETENTION参数。要使用flashback特性,必须启用自动撤销表空间管理。
在oracle 10g中,flash back分为一下成员:Flashback Database、Flashback Drop、Flashback Query(分为Flashback Query、Flashback Version Query、Flashback Transation Query三种)和Flashback Table。
把整个数据库回退到过去的某个时点,依赖于Flashback log日志。速度很快,可以认为是不完全恢复的替代技术。
flashback database包括一个后台进程RVWR(recover write),flashback database log日志和flashback recovery area。一旦数据库启用了flashback database,该RVWR进程会启动,该进程会向flashback database area写入flashback database log。这些日志包括的是数据块的“前镜像”。
查看后台进程 ps -ef|grep rvw
系统默认是关闭flashback database功能的,要启用,需要做以下配置:
需要配置的包括大小和位置,如果是RAC,flashback recovery area必须在共享存储中。数据必须处于archivelog模式。
启用:alter system set db_recovery_file_dest_size=20G,scope=both;
alter system set db_recovery_file_dest='/DBA/FB' scope=both;
禁用:alter system set db_recovery_file_dest='';
首先要将数据库启动到mount状态
flashback database to timestamp to_timestamp('20090101 21:22:22','yyyymmdd hh:24:mi:ss');
flashback database to scn 947921;
执行万flashback database后有两种方式修复数据库,
1)直接以alter database open resetlogs;打开数据库;指定scn或者timestamp后的数据统统丢弃;
2)alter database open read only;打开数据库,通过逻辑导出的方式将误操作的表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据库修复到flashback database前的状态。再
通过逻辑导入的方式将之前误操作的表重新导入,这样的化对现有数据的表影响最小,不会有数据丢失。
从10g开始,用于恢复误删除的对象,包括表和索引。依赖与tablespace recycle bin(表空间回收站)。
flashback不支持sys用户,system表空间下的对象,也不能从表空间回收站中拿到。
从ORACLE10g开始,表空间会存在叫做回收站的逻辑区域,当用户执行drop时,被删除的表和表的关联对象不会被物理删除。
初始化参数recyclebin用于控制是否启用recyclebin,缺省是on,可以使用off关闭。
show recyclebin
flashback table tablename to before drop;
flashback table tablename to before drop rename to b;
select original_name,object_name from recyclebin;
flashback table "object_name" to before drop;
利用多版本读一致性的特性从undo表空间读取操作前的记录数据。
select * from table as of timestamp sysdate-5/1440;
select * from table as of scn scnnumber;
恢复数据使用insert +select方式
oracle内部使用的是scn,即时用的是timestamp也会转换成scn。系统时间与scn之间的关系存在一张表,即sys下的SMON_SCN_TIME;每隔5分钟产生一次记录,表中记录了1440个时间标记与scn的匹配记录
select scn ,to_char(time_dp,'yyyymmdd hh24:mi:ss') from sys.smon_scn_time;
查看过去某个时间段内,数据是如何发生变化的。伪列ORA_ROWSCN(10g新增).
select versions_xid,versions_startscn,versions_endscn,versions_opreration from tablename versions between scn minvalue and maxvalue;
flashback_transation_query表.ORA_ROWSCN数据不修改时不发生变化,是数据块级别。
使用undo信息来实现。可以查看某个事务执行的所有变化,他需要访问flashback_transation_query视图。xid列表示事务id。
sys用户不支持闪回。
flashback talbe也是使用undo tablespace的内容实现数据的回退。
flashback table tablename to scn(to timestamp);
注意:需要表支持row movement。可以在user_tables中查询
select row_movement from user_talbes where table_name='a';
alter table tablename enable row movement;
alter table tablename disable row movement;
1.基于undo 的表恢复,需要注意DDL 操作的影响
第三个就是修改并提交过数据之后,对表做过DDL 操作,包括:
drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。
另外,flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。同时该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 360;的形式。
2. 基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加
ENABLE TRIGGERS 子句。