首页 > 代码库 > Oracle闪回技术详解
Oracle闪回技术详解
概述:
闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就无能为力了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)
撤销段(UNDO SEGMENT)
在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段。因为大部分闪回技术都是基于撤销段的。撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其指派一个撤销段,一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(不过在数据库正常运行时一般不会发生这种情况)。
闪回技术
Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。
闪回查询
a.基本闪回技术
功能:可以查询过去某个时间段的数据库状态。
工作原理:Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。
SQL> select * from dept as of timestamp to_timestamp(‘2016-09-10 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
b.闪回表
功能:可将某个表回退到过去某个时间点
工作原理:同样,Oracle会先去查询撤销段,提取过去某个时间点之后的所有变更,构造反转这些变更的SQL语句进行回退,闪回操作是一个单独的事务,所以若由于撤销数据过期之类的原因导致无法闪回,整个操作会回滚,不会存在不一致的状态。
步骤:
1.启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了)
SQL> alter table emp enable row movement;
2.闪回表操作
SQL> flashback table dept to timestamp to_timestamp(‘2016-09-10 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
闪回表可能会失败,有可能有以下几种情况:
违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表操作失败了;
撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败;
闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,这种情况闪回操作也会失败。
闪回删除
功能:闪回删除可以轻松将一个已经被删除的表还原回来。相应的索引,数据库约束也会被还原(除了外键约束)
原理:Drop命令其实是Rename命令,早期的Oracle版本(10g之前),闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中数据可能还存在,但已成了孤魂野鬼,没法进行恢复了,10g版本之后,Drop命令则仅仅是一个Rename操作,所以恢复就很容易了。
SQL> flashback table emp to before
如果要还原的表名在当前系统中已经被占用,也可以在闪回删除的时候对表重命名
SQL> flashback table emp to before drop rename to emp_new
也可以通过回收站查看当前用户那些表被删除了,每个用户都有一个回收站,这个回收站是个逻辑结构,它不是一块独立的存储空间,它还在当前表空间内,所以如果有别的操作需要空间,回收站就有可能被清空,这也是导致闪回删除失败的原因。
SQL> SHOW RECYCLEBIN;
彻底删除表,闪回删除也无能为力
SQL> DROP TABLE EMP PURGE;
清空回收站
SQL> PURGE RECYCLEBIN;
需要注意区分truncate操作和drop命令,truncate会截断表,清空数据(调节Oracle高水位线),速度很快,弊端是此过程不会产生任何撤销数据或是重做日志,如果误删,恢复异常麻烦,要慎重使用。
后记:闪回归档和闪回数据库后续会做补充。
Oracle闪回技术详解