Oracle闪回删除

Posted 小陈的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle闪回删除相关的知识,希望对你有一定的参考价值。

//
Oracle 11g
//



Oracle闪回技术




1闪回删除是什么?


闪回删除的目的是放置用户错误地删了表、索引等数据库对象。在未使用闪回技术之前,只能使用传统的数据库恢复方式从备份中恢复。此时需要备份文件以及归档日志文件。这样的恢复往往涉及那些不需要恢复的对象,显然不具有针对性,而使用闪回删除就可以直接恢复想恢复的对象,更高效省时。

启动闪回后,在删除一个表时,物理上该表没有被删除,但是它所占有的空间回到空闲列表,也就是这段空间在某种情况下是可以被占用的。

闪回删除的原理


如果使用DROP TABLE指令删除表,该表不会从数据库中立即删除,而是保持原表的位置,但是将删除的表重新命名,并将删除的表信息存储在回收站中,回收站记录了被删除表的新名字和原名字。显然,此时被删除的表所占有的空间没有立即被释放,变成数据库可以使用的潜在空间,记录在回收站中的信息会保留一段时间,直到回收站的时间不够或者使用PURGE指令删除回收站中的记录。


回收站是一个逻辑结构,不具有物理数据结构,只要删除的表信息记录在回收站中就可以通过闪回技术恢复删除的表。


查看闪回删除信息:(默认开启)

开启闪回删除:

SQL>alter system set recyclebin=on scope=both



2回收站的使用


Oracle提供了数据字典user_recyclebin和dba_recyclebin供用户查询数据库中回收站的信息。

Oracle(十二)闪回删除



模拟用户错误删一个表和恢复


Step1:创建一个测试表

Oracle(十二)闪回删除


Step2:删除测试表

Oracle(十二)闪回删除


Step3:查看回收站中该表的记录

Oracle(十二)闪回删除


在对象所属用户模式下,可以通过show recyclebin进行查询。

Oracle(十二)闪回删除


Step4:恢复被删除的表

注意:要还原回收站中的表,必须使用在该表所属用户模式下执行闪回操作。(如果操作出现权限问题,记得要赋予该用户相应的权限)

Oracle(十二)闪回删除



Step5:使用被删除表重命名后的名称恢复,并重命名该表。

Oracle(十二)闪回删除


小细节:一旦drop一个表,和表相关的其他数据库对象如触发器、索引等都被删除,一旦闪回该表时相关数据库对象也自动恢复。但是注意名称已经不是原先的名称了,而是删除后系统自动重启的名称,该名称不易阅读,需要手工修改。

如索引时,可以先drop掉原索引,然后重新create该索引。




恢复多个同名表


在生产库中,有可能一个同名的表被删除,并且这些删除都记录在回收站中没有被删除。那么如何使用闪回恢复同名的表呢?

此时需要我们确认回收站中的哪个表是我们需要闪回的!


实验:

Step1:创建测试表1并删除

Oracle(十二)闪回删除


Step2:创建测试表2并删除(结构不同)

Oracle(十二)闪回删除


Step3:查看回收站详情

Oracle(十二)闪回删除


Step4:查看表详情

Oracle(十二)闪回删除


Step5:恢复表并重命名

Oracle(十二)闪回删除



应用Purge永久删除表

我们知道启动闪回后被删除的对象没有被物理地释放,Oracle提供了两种方式来回收这样的物理空间。

第一种是自动回收,当表空间出现压力时,Oracle会首先使用表空间里不属于回收站的对象所占用的可用空间。如果这部分空间用完,仍然存在空间压力,则释放回收站里面最早的那些对象所占用的空间。直到释放完毕所有的空间,然后扩展数据文件,前提是数据文件支持自动扩展。

第二种是手工方式,使用purge指令手工删除回收站里的对象。在实际的数据库维护中,用户确认不用某个表,又出于该表的安全性所以不希望放入回收站,此时我们使用purge指令来删除该表即可。


Test1:建立一个测试表并使用purge指令删除。

Oracle(十二)闪回删除


Test2

有时候需要永久删除一个表空间,但是又由于该表空间数据量太大,所以不希望该表空间继续占用潜在的磁盘空间,不想放入回收站,此时可以使用drop tablespace ... include contents指令实现。

删除了表空间后,会同时触发一个操作,即Oracle会将回收站中和表空间相关的所有表同时删除。


Test3:如果已经删除了一个表,并且该表记录在回收站中,此时又希望永久删除该表,也需要使用PURGE指令。

Oracle(十二)闪回删除

此时,FTEST将从数据库永久删除,并且和该表对应的其他数据库对象也将永久删除。

同时也可以使用purge tablespace test user scott等方式进行回收站的清空。


Test4:在生产数据库的维护中,有时候需要永久删除某个表空间中的多个表,可以使用如下指令直接删除和某个表空间相关的回收站中的表。





END


小陈今天的分享就到这里啦!

期待下一期的邂逅!




以上是关于Oracle闪回删除的主要内容,如果未能解决你的问题,请参考以下文章

Oracle学习(十三):闪回

Oracle学习(十三):闪回

Oracle闪回机制

oracle闪回查询和闪回数据库

Oracle(十三)闪回查询

oracle闪回的使用