Oracle数据库闪回技术
闪回技术简介
闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成。
在讲闪回技术前,需要先了解Oracle中一个逻辑结构–撤销段。因为大部分闪回技术都需要依赖撤销段中的撤销数据。
撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。
(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段(可以理解为windows系统中的回收站)。
闪回drop(闪回drop可以轻松将一个已经被Drop的表还原。相应的索引,数据库约束也会被还原(除了外键约束)
闪回技术的应用小实例:
1、连接 sqlplus sys/密码 as sysdba; 查看是否开启回收站(如图,我已经开启了),如果没有,先开启回收站
ALTER SYSTEM SET recyclebin = ON; --开启系统回收站 ALTER SESSION SET recyclebin = ON; --开启当前连接回收站 ALTER SYSTEM SET recyclebin = OFF; --关闭系统回收站 ALTER SESSION SET recyclebin = OFF; --关闭当前连接回收站
2、新建测试表,插入测试数据
3、对user_test表执行drop操作,再查询时报:ORA-00942: 表或视图不存在
4、查询数据字典:select * from dba_recyclebin; 查看我们的user_test是否在回收站中,如图确实在回收站中找到了我删除的user_test表,并且是通过drop操作删除的
5、接下来就是闪回了:FLASHBACK table tableName/object_name to before drop; 将表闪回到drop前的一个工作点,这个闪回不要在sys用户下使用
执行完闪回之后,你看表数据又恢复了,不过这种flashback 对 TRUNCATE 操作没用哦,至于TRUNCATE操作如何恢复,需要借助第三方插件或其他容灾方式恢复了
注:
a)不通过表名,直接通过对象名也同样可以完成闪回操作(如果我们同一个表名被删除后,重新建表了,然后又删除了,这是我们表名在回收站中可能就有两个了,这时闪回的时候,可以通过对象名加以区分具体需要闪回的是哪张表了,命令如下)
flashback table "object_name" to before drop;
b)闪回之后重命名,这个比较简单,命令如下
flashback table tableName to before drop rename to new_tableName;
6)当然还有一种情况,我们表被删除了,但是我还想查询里面的数据,又不能把表恢复的情况,可以直接通过回收站的对象名进行闪回查询(注意对象名需要加 "",不然会报错的)
Drop命令其实是Rename命令,早期的Oracle版本(10g之前),闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中数据可能还存在,但已成了孤魂野鬼,没法进行恢复了,10g版本之后,Drop命令则仅仅是一个Rename操作,所以恢复就很容易了
10g版本开始,删除表只是重命名,但是不保证flashback 一定成功。比如删除的表的表名字被占用,期间先创建一个表和被删除的重名则是由于10g版本后对表的删除仅表现为一个rename操作,引入回收站的概念,但此回收站仅是当前表空间的一块逻辑划分,所以会受限于当前表空间的可用空间的限制
解决方法:
1、先将表rename
2、执行闪回操作
3、执行insert select 操作,将后续产生的数据更新到业务表中
注:drop table table_name [purge] 如果你再drop操作中加入了purge参数,那么我们这次介绍的闪回操作就不适用了