【DB笔试面试813】在Oracle中,什么是闪回删除(Flashback DROP)?回收站的作用是什么?​

2020-06-05 11:38:01 浏览数 (1)

题目部分

【DB笔试面试813】在Oracle中,什么是闪回删除(Flashback DROP)?回收站的作用是什么?

答案部分

闪回删除(Flashback DROP)是将已经删除(DROP)的表及表上的索引恢复到删除前的状态,但索引名不会恢复到删除前的状态。这由基于回收站(Recycle Bin)特性实现。

从Oracle 10g开始,为了支持闪回删除(Flashback Drop)功能,Oracle引入了回收站(Recycle Bin)的概念。它的全称叫Tablespace Recycle Bin。回收站实际是一个逻辑容器(逻辑区域),原理有点类似于Windows系统的回收站。它以表空间中现有已经分配的空间为基础,而不是从表空间上物理划出一个固定区域用作回收站。这意味着回收站和表空间中的对象共用存储区域、系统没有给回收站预留空间。

从原理上来说,回收站就是一个数据字典表,放置用户已删除的的数据库对象信息。用户进行DROP操作的对象并没有被数据库删除,仍然会占用空间,除非是由用户手工进行PURGE或者因为存储空间不够而被数据库清除掉。在回收站功能被打开的情况下,当某个表被删除时,它就被移动到了回收站中。该对象一直保存在回收站中,直到清除回收站为止。因此,如果使用类似“DROP TABLE T_LHR;”的语句,那么T_T_LHR表就被移动到了回收站中。如果希望彻底删除T_LHR表,而不是保存在回收站中,那么可以在DROP TABLE命令中使用PURGE参数,命令为“DROP TABLE T_LHR PURGE;”。回收站功能可以在系统和会话级别开启,如下所示:

代码语言:javascript复制
系统级别:ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=SPFILE;

会话级别:ALTER SESSION SET RECYCLEBIN = ON;

关于闪回删除需要注意以下几点:

① 只能用于非系统表空间和本地管理的表空间。在SYSTEM表空间中的表被DROP后不会进入回收站。

② 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。

③ 对象能否恢复成功,取决于对象空间是否被覆盖重用。

④ 当删除表时,依赖于该表的物化视图也会同时被删除,但是由于物化视图并不会被放入回收站,因此,当执行FLASHBACK TABLE TO BEFORE DROP时,也不能恢复依赖于该表的物化视图,这个时候就需要DBA手工介入重新创建物化视图。

⑤ 对于回收站中的对象,只支持查询。

⑥ 表被恢复以后,表上的索引,需要重建,虽然索引可以随着表的闪回而闪回,但是闪回后的索引仍然使用回收站中的名称,因此,需要重建索引。

⑦ 在使用“FLASHBACK TABLE ... TO BEFORE DROP”命令从回收站恢复表及其所有可能的相关对象时,可以指定表的原始名称或删除对象时分配给对象的系统生成名称。如果指定原始名称,且回收站包含多个具有该名称的对象,那么Oracle会最先恢复最晚移动到回收站的对象(LIFO:后进先出)。如果删除原始表后又在同一用户中创建了同名的新表,那么这个时候再执行FLASHBACK TABLE时会返回错误,此时需要指定RENAME TO子句。

闪回回收站中指定的表:

代码语言:javascript复制
FLASHBACK TABLE "BIN$zltzJRsMB0PgRAAY/i3Kdw==$0" TO BEFORE DROP;

在使用“FLASHBACK TABLE ... TO BEFORE DROP”命令从回收站恢复表及其所有可能的相关对象时,可以指定表的原始名称或删除对象时分配给对象的系统生成名称。如果指定原始名称,且回收站包含多个具有该名称的对象,那么Oracle会最先恢复最晚移动到回收站的对象(LIFO:后进先出)。如果删除原始表后又在同一用户中创建了同名的新表,那么这个时候再执行FLASHBACK TABLE时会返回错误,此时需要指定RENAME TO子句。

下面给出一个使用回收站的例子:

代码语言:javascript复制
SYS@oralhr> SHOW PARAMETER RECYCLEBIN
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
recyclebin                           string                 OFF
SYS@oralhr> alter system set recyclebin=on scope=spfile;
System altered.
SYS@oralhr> STARTUP FORCE;  ====》慎用,不推荐
ORACLE instance started.
Total System Global Area 3089920000 bytes
Fixed Size                  2250360 bytes
Variable Size             721422728 bytes
Database Buffers         2348810240 bytes
Redo Buffers               17436672 bytes
Database mounted.
Database opened.
SYS@oralhr>  SHOW PARAMETER RECYCLEBIN
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
recyclebin                           string                 ON
SYS@oralhr> CREATE TABLE TB_20160627_LHR AS SELECT * FROM DUAL;
Table created.
SYS@oralhr> DROP TABLE TB_20160627_LHR;
Table dropped.
SYS@oralhr> SELECT * FROM DBA_RECYCLEBIN;
no rows selected
SYS@oralhr> CREATE TABLE  TB_20160627_LHR TABLESPACE USERS AS SELECT * FROM DUAL;
Table created.
SYS@oralhr> DROP TABLE TB_20160627_LHR;
Table dropped.
SYS@oralhr> SELECT * FROM DBA_RECYCLEBIN;
OWNER      OBJECT_NAME                    ORIGINAL_NAME
--------- ------------------------------ ----------------
SYS       BIN$Njoq6PZtAGzgUxa8wKsAbA==$0 TB_20160627_LHR

需要特别注意的是,SYSTEM表空间的表被DROP后不会进入回收站空间。

& 说明:

有关回收站的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2136497/、http://blog.itpub.net/26736162/viewspace-2121136/、http://blog.itpub.net/26736162/viewspace-2121137/

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

0 人点赞