使用 Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表。以下是一个不该发生却经常发生的情况:用户删除了一个非常重要的表 — 当然是意外地删除 — 并需要尽快地恢复。 
						
							
此外,有几种方法可以手动控制回收站。如果在删除名为 TEST 的特定表之后需要从回收站中清除它,可以执行。
或者使用其回收站中的名称: 
| PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
 | 
此命令将从回收站中删除表 TEST 及所有相关对象,如索引、约束等,从而节省了空间。但是,如果要从回收站中永久删除索引,则可以使用以下命令来完成工作: 
此命令将仅仅删除索引,而将表的拷贝留在回收站中。有时在更高级别上进行清除可能会有用。例如,您可能希望清除表空间 USERS 的回收站中的所有对象。可以执行: 
  您也许希望只为该表空间中特定用户清空回收站。在数据仓库类型的环境中,用户创建和删除许多临时表,此时这种方法可能会有用。您可以更改上述命令,限定只清除特定的用户: 
| PURGE TABLESPACE USERS USER SCOTT;
 | 
诸如 SCOTT 等用户可以使用以下命令来清空自己的回收站:
DBA 可以使用以下命令清除任何表空间中的所有对象:
可以看到,可以通过多种不同方法来管理回收站,以满足特定的需要。
表版本和闪回功能 
用户可能会经常多次创建和删除同一个表,如: 
| CREATE TABLE TEST (COL1 NUMBER);
 INSERT INTO TEST VALUES (1);
 
 commit;
 
 DROP TABLE TEST;
 
 CREATE TABLE TEST (COL1 NUMBER);
 
 INSERT INTO TEST VALUES (2);
 
 commit;
 
 DROP TABLE TEST;
 
 CREATE TABLE TEST (COL1 NUMBER);
 
 INSERT INTO TEST VALUES (3);
 
 commit;
 
 DROP TABLE TEST;
 | 
此时,如果您要对表 TEST 执行闪回操作,那么列 COL1 的值应该是什么?常规想法可能认为从回收站取回表的第一个版本,列 COL1 的值是 1。实际上,取回的是表的第三个版本,而不是第一个。因此列 COL1 的值为 3,而不是 1。 
此时您还可以取回被删除表的其他版本。但是,表 TEST 的存在不允许出现这种情况。您有两种选择: 
使用重命名选项: 
| FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;
 FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;
 | 
这些语句将表的第一个版本恢复到 TEST1,将第二个版本恢复到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值将分别是 1 和 2。或者,使用表的特定回收站名称进行恢复。为此,首先要识别表的回收站名称,然后执行: 
| FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw
 ==$0" TO BEFORE DROP RENAME TO TEST2;
 
 FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw
 
 ==$0" TO BEFORE DROP RENAME TO TEST1;
 | 
这些语句将恢复被删除表的两个版本。 
警告 
取消删除特性使表恢复其原始名称,但是索引和触发器等相关对象并没有恢复原始名称,它们仍然使用回收站的名称。在表上定义的源(如视图和过程)没有重新编译,仍然保持无效状态。必须手动得到这些原有名称并应用到闪回表。 
信息保留在名为 USER_RECYCLEBIN 的视图中。在对表进行闪回操作前,请使用以下查询来检索原有名称。
| SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE
 FROM USER_RECYCLEBIN
 
 WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN
 
 WHERE ORIGINAL_NAME = 'RECYCLETEST')
 
 AND ORIGINAL_NAME != 'RECYCLETEST';
 OBJECT_NAMEORIGINAL_N TYPE
 ------------------------------ ---------- --------
 
 BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01  INDEX
 
 BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER
 | 
在表进行闪回操作后,表 RECYCLETEST 上的索引和触发器将按照 OBJECT_NAME 列中所示进行命名。根据以上查询,可以使用原始名称重新命名对象,如下所示:
| ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;
 ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
 | 
一个值得注意的例外情况是位图索引。当删除位图索引时,它们并不放置在回收站中 — 因此无法检索它们。约束名称也无法从视图中检索。必须从其他来源对它们进行重命名。
查看本文来源