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

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

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

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

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

2,闪回drop(闪回drop能够轻松将一个已经被Drop的表还原。相应的索引,数据库约束也会被还原(除了外键约束))
先直接来个例子,让大伙感觉下什么是闪回drop
1)链接sqlplus / as sysdba,查看是否开启回收站,若是未开启(以下图我已经开启了回收站):windows

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参数,那么咱们此次介绍的闪回操做就不适用了(固然也是能够找回的,具体操做后面有机会再作介绍)oracle

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

关于oracle的闪回drop就先介绍到这里了,但愿对你们有所帮助!svg

有兴趣的能够看下下一篇,闪回查询相关介绍:https://blog.csdn.net/baomw/article/details/84196984工具