专题实验 oracle 闪回特性

来源:互联网 发布:王家卫 话题 知乎 编辑:程序博客网 时间:2024/04/30 01:43

在 oracle 9i 之前的版本中, 如果用户因为误操作 delete 或 update 并提交了, 那么恢复这些用户的操作错误是极其低效的.

为此, oracle 提供了闪回功能, 通过回退, 我们可以找回正确的数据.

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 ;

找到研发人员确认, 已经满足要求, 找回了误删数据.

flashback 新功能

数据库级别闪回: 能够将整个数据库恢复到过去时间点 ( 个人感觉用处不大 )

表级闪回: 增加了对 drop 掉表的数据闪回 flashback table <tablename> to before drop [rename to new_table_name];

行级闪回: 闪回查询可以将表中的记录恢复到过去的时间点

事务闪回: 通过事务级闪回, 可以按照事务将数据库变更闪回.

0 0
原创粉丝点击