什么是回收站?
回收站实际上是一个包含了删除对象信息的数据字典表。删除的表和任何相关的对象,如索引,约束,嵌套表等,不会被删除,并且仍然占用空间。它们继续计入用户空间配额,直至从回收站删除或由于超过表空间大小限制而被数据库删除等不希望出现的情况。。
每个用户都可以看作是有他自己的回收站,因为,除非用户有SYSDBA权限,否则用户只能访问到回收站中属于自己的对象。用户可以使用下面的语句查看回收站中属于他的所有对象:
点击(此处)折叠或打开
- SELECT * FROM RECYCLEBIN;
当你删除一个用户,属于用户的所有对象都没有放在回收站,并且回收站的任何所有将被清除。
当你删除一个簇,它的成员表不放在回收站,并且回收站任何成员表被清除。
当你删掉一个类型,所有依赖的对象,如子类型不放在回收站和回收站前的任何依赖的对象被清除。
回收站中的对象命名
当一个被删除的表移动到回收站,该表及其相关对象会被赋予系统生成的名称。这样可以避免由多表重名引发的名称冲突。这可能发生在下列情况下:
- 用户删除表,使用相同的名称重新创建它,然后再次删除。
- 两个用户都拥有相同名称的表,并且两个用户都删除各自的表。
重命名惯例如下:
点击(此处)折叠或打开
- BIN$unique_id$version
其中:
unique_id是26个字符的全局唯一标识符对象,这使得所有回收站对象的名字的在数据库中是唯一的。
version是由数据库分配的版本号
启用和禁用回收站
当启用回收站时,删除的表及其相关对象保存在回收站中。当回收站被禁用时,删除的表及其相关对象不放在回收站;他们只是被删除,你必须使用其他手段来恢复它们(如从备份中恢复)。
禁用回收站不清除或以其他方式影响回收站中的已有对象。回收站默认情况下是启用的。
你可以通过修改回收站初始化参数来启用、禁用回收站。该参数不是动态的,因此当你使用ALTER SYSTEM语句更改参数时,需要重启数据库才能生效。
禁用回收站
1.执行以下语句之一:
点击(此处)折叠或打开
-
ALTER SESSION SET recyclebin = OFF;
-
- ALTER SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
启用回收站
1.执行以下语句之一:
点击(此处)折叠或打开
-
ALTER SESSION SET recyclebin = ON;
-
- ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
在回收站中查看和查询对象
Oracle数据库提供了两种视图,以获得关于回收站中的对象的信息:
视图 | 描述 |
USER_RECYCLEBIN |
该视图可以被用户看到回收站自己删除的对象。它有一个同义词RECYCLEBIN,以方便使用。 |
DBA_RECYCLEBIN |
该视图使管理员能看到在回收站中所有被删除的对象 |
这些视图的其中一个作用是识别数据库分配给删除对象的名称,如下面的例子:
点击(此处)折叠或打开
-
SELECT object_name, original_name FROM dba_recyclebin
-
WHERE owner = \'HR\';
-
-
OBJECT_NAME ORIGINAL_NAME
-
------------------------------ --------------------------------
- BIN$yrMKlZaLMhfgNAgAIMenRA==$0 EMPLOYEES
点击(此处)折叠或打开
-
SQL> show recyclebin
-
-
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
-
---------------- ------------------------------ ------------ -------------------
- EMPLOYEES BIN$yrMKlZaVMhfgNAgAIMenRA==$0 TABLE 2003-10-27:14:00:19
点击(此处)折叠或打开
- SELECT * FROM \"BIN$yrMKlZaVMhfgNAgAIMenRA==$0\";
清除回收站中的对象
如果你决定,你永远不会从回收站还原项目,您可以使用PURGE语句从回收站中移除项目及其关联的对象并释放他们的存储空间。执行该操作,您需要与删除项目相同的权限。
当您使用PURGE语句来清除表时,您可以使用该表的回收站名称或表的原始名称。回收站名称可以通过查询DBA_或USER_RECYCLEBIN视图来获取。下面假设的例子清除表hr.int_admin_emp,当它被放置在回收站时被改名为BIN$ jsleilx392mk2=293$0:
点击(此处)折叠或打开
- PURGE TABLE \"BIN$jsleilx392mk2=293$0\";
点击(此处)折叠或打开
- PURGE TABLE int_admin_emp;
点击(此处)折叠或打开
-
PURGE TABLESPACE example;
- PURGE TABLESPACE example USER oe;
点击(此处)折叠或打开
- PURGE RECYCLEBIN;
您还可以使用PURGE语句从回收站中清除索引或从回收站清除指定表空间的所有对象。
从回收站还原表
使用FLASHBACK TABLE ... TO BEFORE DROP语句从回收站中恢复对象。你可以指定表在回收站的名称或原始表名。一个可选的重命名为子句允许你恢复它并重新命名表。回收站的名称可以通过查询DBA_或USER_RECYCLEBIN视图来得到。使用FLASHBACK TABLE ... TO BEFORE DROP语句,你需要删除该表所需要的相同的权限。
下面的示例恢复int_admin_emp表,并分配给它一个新的名字:
点击(此处)折叠或打开
-
FLASHBACK TABLE int_admin_emp TO BEFORE DROP
- RENAME TO int2_admin_emp;
点击(此处)折叠或打开
-
SELECT object_name, original_name, createtime FROM recyclebin;
-
-
OBJECT_NAME ORIGINAL_NAME CREATETIME
-
------------------------------ --------------- -------------------
-
BIN$yrMKlZaLMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:21:05:52
-
BIN$yrMKlZaVMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:21:25:13
-
BIN$yrMKlZaQMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:22:05:53
-
- FLASHBACK TABLE \"BIN$yrMKlZaVMhfgNAgAIMenRA==$0\" TO BEFORE DROP;
恢复相关对象
当你从回收站恢复表,相关对象,如索引没有恢复到他们的原始名称;他们保留的是系统生成的回收站名字。您必须手动重命名相关对象,以恢复原来的名称。如果您打算为相关对象手动恢复原来的名称,请确保在你恢复表之前,记下每个相关对象的系统生成的回收站名字。
以下是恢复的某些被删除表JOB_HISTORY的索引的原始名称,是HR示例模式的一个例子。该示例假设您登录的HR用户。
1.删除JOB_HISTORY之后,从回收站恢复它之前,运行以下查询:
点击(此处)折叠或打开
-
SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;
-
-
OBJECT_NAME ORIGINAL_NAME TYPE
-
------------------------------ ------------------------- --------
-
BIN$DBo9UChtZSbgQFeMiAdCcQ==$0 JHIST_JOB_IX INDEX
-
BIN$DBo9UChuZSbgQFeMiAdCcQ==$0 JHIST_EMPLOYEE_IX INDEX
-
BIN$DBo9UChvZSbgQFeMiAdCcQ==$0 JHIST_DEPARTMENT_IX INDEX
-
BIN$DBo9UChwZSbgQFeMiAdCcQ==$0 JHIST_EMP_ID_ST_DATE_PK INDEX
- BIN$DBo9UChxZSbgQFeMiAdCcQ==$0 JOB_HISTORY TABLE
点击(此处)折叠或打开
- FLASHBACK TABLE JOB_HISTORY TO BEFORE DROP;
点击(此处)折叠或打开
-
SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = \'JOB_HISTORY\';
-
-
INDEX_NAME
-
------------------------------
-
BIN$DBo9UChwZSbgQFeMiAdCcQ==$0
-
BIN$DBo9UChtZSbgQFeMiAdCcQ==$0
-
BIN$DBo9UChuZSbgQFeMiAdCcQ==$0
- BIN$DBo9UChvZSbgQFeMiAdCcQ==$0
点击(此处)折叠或打开
-
ALTER INDEX \"BIN$DBo9UChtZSbgQFeMiAdCcQ==$0\" RENAME TO JHIST_JOB_IX;
- ALTER INDEX \"BIN$DBo9UChuZSbgQFeMiAdCcQ==$0\" RENAME TO JHIST_EMPLOYEE_IX;