oracle闪回技术详解之闪回drop(神奇的flashback)

写在前面:删库跑路,相信这是绝大多数程序员会经常听到的一个词。俗话说:常在河边走,哪有不湿鞋,作为经常和数据打交道的程序员也好,运维实施也好,有时难免会出现数据误删除,误操作等情况。如果你是一个oracle用户,那么你如果知道这些关于数据闪回恢复的基本知识,或许可以帮你在出现类似情况的时候解决很多问题。

本文主要介绍一下数据库的误drop操作的一些闪回技术,至于整库的删除恢复,想在另一篇文章里详细介绍。

再来说一个案例吧:今年34月的时候吧,一次现场运维在操作测试库的时候,误连了生产数据库,执行了一个drop操作,将生产的流程核心业务表删除,删除之后发现连错库了,当时,情急之下,他将测试库建表脚本导出,在生产环境执行建表脚本,然后才联系我找解决措施(当然,后续通过我们的闪回技术,将之前删除的业务表数据以及后续表重建后的数据全部找回)。下面就来详细介绍下我们的闪回技术

1,概念
闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成
在讲闪回技术前,需要先了解Oracle中一个逻辑结构–撤销段。因为大部分闪回技术都需要依赖撤销段中的撤销数据。
撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。
(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段(你可以理解为windows系统中的回收站)。

2,闪回drop(闪回drop可以轻松将一个已经被Drop的表还原。相应的索引,数据库约束也会被还原(除了外键约束))
先直接来个例子,让大伙感受下什么是闪回drop
1)连接sqlplus / 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操作,再查询时报:表或视图不存在在这里插入图片描述
4),查询数据字典:select * from dba_recyclebin; 查看我们的user_test是否在回收站中,如图确实在回收站中找到了我删除的user_test表,并且是通过drop操作删除的
在这里插入图片描述
5)接下来就是我们的明星命令了:FLASHBACK table tableName to before drop; 将表闪回到drop前的一个工作点
在这里插入图片描述
执行完闪回之后,你看表数据又恢复了,不过这种flashback 对 TRUNCATE 操作没用哦,至于TRUNCATE操作如何恢复,需要借助第三方插件或其他容灾方式恢复了,后面我会介绍通过第三方插件恢复TRUNCATE操作
注:
a)不通过表名,直接通过对象名也同样可以完成闪回操作(如果我们同一个表名被删除后,重新建表了,然后又删除了,这是我们表名在回收站中可能就有两个了,这时闪回的时候,可以通过对象名加以区分具体需要闪回的是哪张表了,命令如下)
flashback table “BIN$mKoYM02RCojgQAB/AQAvyw==$0” 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操作,引入回收站的概念,但此回收站仅是当前表空间的一块逻辑划分,所以会受限于当前表空间的可用空间的限制
上述案例中:
由于同事在drop后执行了建表操作,导致无法直接闪回成原来的表名:
解决方法:1,先将表rename
2,执行闪回操作
3,执行insert select 操作,将后续产生的数据更新到业务表中
注意:drop table table_name [purge] 如果你再drop操作中加入了purge参数,那么我们这次介绍的闪回操作就不适用了(当然也是可以找回的,具体操作后面有机会再做介绍)

3,回收站管理
对于回收站管理,我这边主要介绍三个命令,谨慎使用哦
> show recycle; 查看回收站.
> purge recyclebin; 清空回收站.
> purge table t2 ; 清空回收站中t2的表.

关于oracle的闪回drop就先介绍到这里了,希望对大家有所帮助!

有兴趣的可以看下下一篇,闪回查询相关介绍:http://www.javashuo.com/article/p-peqwtpit-ow.html