在 oracle 9i 之前的版本中, 如果用户因为误操作 delete 或 update 并提交了, 那么恢复这些用户的操作错误是极其低效的.
为此, oracle 提供了闪回功能, 通过回退, 我们可以找回正确的数据.
通过闪回查询我们可以按照时间戳或SCN来向前查询, 获取修改之前的数据镜像, 再通过insert等操作就可以恢复数据.
闪回查询一来于回滚段中存储的数据前镜像, 在oracle9i以前的版本中, 通常只要事务提交后, 前镜像数据就可以被覆盖, 空间可以重用; 在oracle 9i中oracle引入了自动回滚管理(Automatic undo Management, 简称AUM) 新特性, 在AUM模式下, 我们可以通过调整 undo_retention参数来设置数据库UNDO信息的保留时间, 只要镜像没有被覆盖, 那么闪回就是可能的, 但是需要注意的是, undo信息的保留还同 undo表空间中的可用空间有关, 如果空间紧张, 为了满足事务的需要, 非活动的前镜像信息是可以被覆盖的.
通过 as of 语法, 可以对表, 视图, 物化视图进行 flashback query(闪回查询), 可以指定 SCN 或者 timestamp.
select systimestamp from dual;
select count( * ) from t as of timestamp( systimestamp – interval’10’second); -- 通过 timestamp
select dbms_flashback.get_system_change_number scn from dual; -- 获得 scn 18995692584
select count( * ) from t as of scn 18995692584;
某日下午接到研发工程师电话, 报告说误删除了部分重要数据, 并且已经提交, 需要恢复.
登陆数据库, 首先确认SCN的变化, 可以通过 v$archive_log 视图查询: select name, first_change# fscn.next_change# nscn.first_time from v$archive_log;
当前 scn : select dbms_flashback.get_system.change_number fscn from dual;
使用应用用户尝试闪回: connect username/password
现有数据: select count( * ) from hs_passport;
创建恢复表: create table hs_password_recov as select * from hs_passport where 1 = 0;
选择适当的SCN 进行闪回查询: select count( * ) from hs_passport as of scn 12929970422; -- 可以尝试多个SCN, 获得最佳值(如果能知道具体操作时间, 那么可以获得准确的数据闪回 )
select count( * ) from hs_passport as of scn &scn; -- 这里使用绑定变量, 每次尝试一个scn, 查看最佳值
最后选择 scn 为 12929941968 的时间点:
insert into hs_passport_recov select * from hs_passport as of scn 12929941968 ; commit ;
找到研发人员确认, 已经满足要求, 找回了误删数据.
数据库级别闪回: 能够将整个数据库恢复到过去时间点 ( 个人感觉用处不大 )
表级闪回: 增加了对 drop 掉表的数据闪回 flashback table <tablename> to before drop [rename to new_table_name];
行级闪回: 闪回查询可以将表中的记录恢复到过去的时间点
事务闪回: 通过事务级闪回, 可以按照事务将数据库变更闪回.
专题实验 oracle 闪回特性,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/moveofgod/p/3794674.html