Oracle的闪回功能受到3个数据库结构之一的支持: 撤消数据、闪回恢复区和回收站。
撤消表空间中的撤销数据不仅支持事务回滚,也支持大多数闪回表操作。Flashback Data Archives允许查询先前版本的表行,它在撤销表空间之外的一个或多个表空间中提供一个区域,支持的保留期比撤销表空间还长。闪回日志保存在闪回恢复区中,从而无需执行传统的还原和恢复操作,即可方便地将整个数据库回滚到过去的时间点。每个表空间中的回收站包含一个或多个版本的已删除的表和索引,如果表空间中的空间充裕,用户可以方便地将其还原。
1.从回收站还原已经删除的表
(1).启用回收站功能
alter session set recyclebin=on; -- 启用/禁用回收站(会话级) on/off
alter system set recyclebin=on; -- 启用/禁用回收站(系统级) on/off
在撤销表空间的大小有限,确保闪回操作或长期运行的查询取得成功,必须在创建表空间后为撤销表空间指定retention guarantee.
alter tablespace undotbs1 retention guarantee;
(2).使用闪回查询
select * from tablename as of timestamp to_timestamp(‘2014/11/19 19:22:30‘,‘YYYY/MM/DD HH24:MI:SS‘);
select * from employees as of timestamp systimestamp - interval ‘60‘ minute; -- 60分钟前
select * from tablename as of timestamp (systimestamp - 1/1440); -- 1分钟前
(3).使用闪回版本查询
select dbms_flashback.get_system_change_number from dual; -- 查看SCN编号
select * from tablename versions between scn 2710111 and 2710113 where ...;
select a.*, versions_startscn, versions_starttime,
versions_endscn, versions_endtime,
versions_xid, versions_operation
from mms.usr_mstr versions between scn 2847161 and 2847403 a
(2).配置闪回表功能
grant flashback on tablename to username; -- 将表的flashback权限授予用户
grant flashback any table to username; -- 或将flashback any table权限授予用户
alter table tablename enable row movement; -- 开启Row movement
(3).使用闪回表
delete from tablename;
flashback table tablename1,tablename2 to timestamp to_timestamp(‘2014-12-08 15:30:01‘, ‘yyyy-mm-dd hh24:mi:ss‘);
flashback table tablename to scn 1763103;
flashback table tablename to timestamp systimestamp - interval ‘15‘ minute;
5.设置和使用闪回数据归档
(1).闪回数据归档(Flashback Data Archive)
Flashback Data Archive创建一个或多个仓库区域(其中一个是默认区域),为仓库中的对象指定默认的保留期,然后为适当的表添加跟踪标记。
Flashback Data Archive的行为与撤销表空间类似,但是Flashback Data Archive仅记录UPDATE和DELETE语句,不记录INSERT语句。另外,对于撤销数据而言,所有对象的保留期限通常为数小时或数天,而Flashback Data Archive中的行可以跨越多年,Flashback Data Archive的关注范围更狭窄,只记录对表行的历史改动。
可以像在闪回查询的SELECT语句中使用AS OF子句一样,访问Flashback Data Archive中的数据。闪回版本查询和闪回事务查询也可以使用Flashback Data Archive中的数据。
<3>维护归档
-- 为归档添加表空间
alter flashback archive fbarcdef add tablespace fbdata02 quota 400m;
-- 使用Purge清除归档数据
alter flashback archive fbarcdef purge before timestamp to_timestamp(‘2014-12-12 00:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘);
<4>将表分配到归档中.
alter table tablename flashback archive fbarcdef;
<5>取消表的归档.
alter table tablename no flashback archive;
(3).查询Flashback Data Archive
可以像使用撤销表空间中的DML活动时那样,通过在表中使用AS OF子句查询Flashback Data Archive中的表的历史数据。
实际上,对用户而言,查询使用撤销表空间还是Flashback Data Archive是完全透明的。
delete from employees where enployee_id = 169;
select * from employees as of timestamp (systimestamp - interval ‘28‘ day);
select * from employees as of timestamp (systimestamp - interval ‘2‘ minute);
--必须配置归档日志到快速恢复区
alter system set db_recovery_file_dest=‘/u01/app/oracle/fast_recovery_area‘;
alter system set log_archive_dest_3=‘location=USE_DB_RECOVERY_FILE_DEST mandatory‘;
alter system set db_recovery_file_dest_size=40G;
-- 启用闪回数据库
shutdown immediate;
startup mount exclusive;
alter database archivelog;
alter system set db_flashback_retention_target=2880;
alter database flashback on;
alter database open;
-- 关闭闪回数据库
startup mount exclusive;
alter database flashback off;
alter database open;
(2).执行闪回数据库
可以使用RMAN和SQLPLUS执行闪回数据库
-- 线程(实例)和特定日志序列号的闪回
RMAN> flashback database to sequence=307 thread=2;
-- 使用sqlplus执行flashback database命令
flashback [standby] database [database]
{ to { scn | timestamp } expr |
to before { scn | timestamp } expr |
to restore point expr
}
shutdown immediate;
startup mount exclusive;
flashback database to timestamp sysdate - (1/24);
flashback database to scn 1790640; -- SCN: select ora_rowscn from tablename; -- select dbms_flashback.get_system_change_number from dual;
alter database open resetlogs; -- 打开数据库重设日志
(3).排除表空间闪回
alter tablespace example flashback off; -- 表空间关闭闪回数据库
alter tablespace example flashback on; -- 表空间启用闪回数据库