当用户删除表时,数据库并不立即移出删除的表空间。数据库将表重命名,并将该表存储在回收站中,如果该表是意外被删除的,可以在以后将该表恢复为正常状态。这种功能叫做Flashback Drop.
注意,Flashback Drop使用回收站中的数据,而不是undo数据来恢复。
回收站实际上是一个数据字典表,其中包括有关删除对象的信息。删除的表和任何相关的对象,例如索引、约束和嵌套表都不会移出,并继续占有空间。它们的空间继续计算在用户空间的配额中,直到从回收站中指定清楚它们。与删除的表关联的空间并不能立即使用,但是会在数据字典视图DBA_FREE_SPACE中显示出来。当表空间的容量不足时,回收站中的对象会按照先进先出的原则真正删除。
已删除的表仍可从回收站直接访问。
一个用户可以使用如下语句查看回收站中属于他的对象:
select * from recyclebin;
与此不同,删除表空间、用户等时,其包含的对象不会放到回收站中,并且回收站中与之相关的对象也会被清除。
当一个被删除的表移到回收站中时,该表和它的相关对象被赋予了一个系统生产的名称。这是为了避免出现对象名称冲突的情况:
a.用户删除了一个表,并使用相同的名称重建,然后再次删除。
b.两个用户使用相同的名称创建表,并且这两个用户都删除了各自的表。
重命名进行如下转换:
BIN$unique_id$version
* Unique_id 是一个具有26个字符的全局唯一标识符。构成回收站的这个名称在所有数据库中都是唯一的。
* Version是被数据库分配的一个版本号。
可以使用初始化参数RECYCLEBIN来打开和关闭回收站。
打开回收站时,删除的表和它们依赖的对象被放置在回收站中。当回收站被关闭时,删除的表和他们的依赖对象不会放置到回收站中,这时必须使用其他方法来恢复被删除的表(如从备份中恢复)。
回收站在默认情况下是打开的。
查看回收站的状态:
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- --------
recyclebin string on
关闭回收站:
alter session set RECYCLEBIN=OFF;
alter system set RECYCLEBIN=OFF;
关闭回收站时不清除或者覆盖已经存在于回收站中的对象。
打开回收站:
alter session set RECYCLEBIN=ON;
alter system set RECYCLEBIN=ON;
同样,可以在文本初始参数文件initSID.ORA文件中设置RECYCLEBIN参数值,例如:
RECYCLEBIN=ON
Oracle提供了两个视图用于获取回收站中有关对象的信息:
* user_recyclebin,该视图用于查询用户自己存放在回收站中的删除对象。该视图一个叫做recyclebin的同义词,这样可以更方便地使用。
* dba_recyclebin,所有回收站中所有被删除的对象。
使用这些视图可以确定被删除对象在数据库中的原始对象名称。
SQL> select object_name,original_name from dba_recyclebin where owner='CLD';
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$wVuaB6pPTrmd7e9AW41kcA==$0 TEST123
BIN$gZMy+ZOzROWBZFdTSY/mew==$0 TEST_LOAD
BIN$Vy0Km18eRySXhPlItJEeog==$0 TEST_LOAD
BIN$apn8tRlzTum3cU1o2s/slg==$0 WMR_GV641_ALL_TEMP
BIN$P7vwyQuQQjqsg4B/Hakpnw==$0 WMR_GV641_ALL
还可以使用show recyclebin的sqlplus命令查看回收站的内容。
可以查看回收站中的对象内容,但是,必须指定回收站中的对象名:
SQL> select * from "BIN$gZMy+ZOzROWBZFdTSY/mew==$0";
ID UNAME PHONE
---------- -------------------- --------------------
1 Amy 0571-1234567
2 Tom 0571-7654311
如果用户决定永远不再恢复回收站中的对象,可以使用purge语句将回收站中的对象删除,并且释放这些对象所占用的空间。如果要删除这些项目,需要一些权限。
使用purge语句去清除一个表时,可以使用回收站中的对象名称或该表原始的名称。例如:
purge table BIN$gZMy+ZOzROWBZFdTSY/mew==$0;
使用下面的语句可以完成相同的功能:
purge table TEST_LOAD;
还可以使用purge语句去清除存储在一个指定表空间中的、存储在回收站中所有的对象,或者清除只属于一个指定用户的对象。例如:
purge tablespace example;
purge tablespace example user oe;
通过运行下面语句,用户可以清除回收站中属于他自己的对象,并释放对象的空间:
purge recyclebin;
如果用户具有sysdba权限,那么可以通过指定dba_recyclebin来清除整个回收站:
purge dba_recyclebin;
整理自《Oracle数据库管理与优化宝典》