Oracle Database 10g:删除表
Oracle Database 10g:删除表 g 中的闪回表特性,可以毫不费力地恢复被意外删除的表
— 当然是意外地删除 — 并需要尽快地恢复。(在某些时候,这个不幸的用户可能就是 DBA!)
g 中的闪回表特性,它使得被删除表的恢复过程如同执行几条语句一样简单。让我们来看该特性是如何工作的。
SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------ ------- ----------RECYCLETEST TABLE
SQL> drop table recycletest;Table dropped.
SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
BIN$04LhcpndanfgMAAAAAANPw==$0。这就是所发生的事情:被删除的表 RECYCLETEST 并没有完全消失,而是重命名为一个由系统定义的名称。它存在于同一个表空间中,具有与原始表相同的结构。如果在该表上定义了索引或触发器,则它们也被重命名,使用与表相同的命名规则。任何相关源(如过程)都失效;原始表的触发器和索引被改为放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被删除表的完整对象结构。
SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ ------------------RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31
FLASHBACK TABLE 命令:
SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK COMPLETE.SQL> SELECT * FROM TAB;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------RECYCLETEST TABLE
瞧!表毫不费力地恢复了。如果现在查看回收站,它将是空的。
PURGE RECYCLEBIN;
DROP TABLE RECYCLETEST PURGE;
g 之前的版本一样。
— 因而没有释放表空间 — 那么当被删除的对象占用了所有空间时,会发生什么事?
PURGE TABLE TEST;
PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
purge index in_test1_01;
PURGE TABLESPACE USERS;
PURGE TABLESPACE USERS USER SCOTT;
PURGE RECYCLEBIN;
PURGE DBA_RECYCLEBIN;
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;
使用重命名选项:
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;
这些语句将恢复被删除表的两个版本。
SELECT OBJECT_NAME, ORIGINAL_NAME, TYPEFROM USER_RECYCLEBINWHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBINWHERE ORIGINAL_NAME = 'RECYCLETEST')AND ORIGINAL_NAME != 'RECYCLETEST';OBJECT_NAME ORIGINAL_N TYPE------------------------------ ---------- --------BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01 INDEXBIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER
ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
— 因此无法检索它们。约束名称也无法从视图中检索。必须从其他来源对它们进行重命名。
FLASHBACK TABLE RECYCLETEST TO SCN 2202666520;
此特性使用 Oracle 数据泵技术来创建不同的表,使用闪回功能将该 SCN 处的数据版本填充到表中,然后用新表替代原始表。为找出能够在何种程度上对表进行闪回操作,可以使用 Oracle Database 10g 的版本控制特性。(更多详细信息请参见本系列第 1 周的内容。)在闪回子句中也可以指定时间戳记而不是指定 SCN。