Flashback Drop闪回删除

flashback drop闪回删除允许你将之前删除的表(但不是截断的表)恢复到刚好删除它之前的状态,同时还会恢复所有索引以及任何触发器和权限。唯一的主键和非空约束也会被恢复------但不包括外键约束。
注意:flashback drop命令仅适用与表。

实现闪回删除:
在oracle9i及其之前的版本,当删除一个表时,该表的所有引用都会从数据字典中删除。如果能够查看过去的drop table命令的源代码,就可以看到它实际上是定义了表及其空间占用的SYS模式中的一系列针对各种表的delete命令,后面跟着一个commit命令。实际上并没有将数据从磁盘清除,但是删除的表占用的空间被标识为未使用,因而空间可以重用。尽管表的数据块扔存在,但是无法找到它们。因为数据字典没有记录哪些块属于删除的表。恢复表的唯一方法是执行时间点恢复,将表恢复到删除之前的时间点。
从10g版本的oracle database开始,drop table命令实现方式完全不一样了。在这些版本的数据库中根本没有删除表,而只是重命名它们。
SCOTT@orcl 07-OCT-14>create table test as select * from dept where 1=2; 

Table created. 

SCOTT@orcl 07-OCT-14>desc test 
Name Null? Type 
----------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------------------- 
DEPTNO NUMBER(2) 
DNAME VARCHAR2(14) 
LOC

SCOTT@orcl 07-OCT-14>insert into test select * from dept; 

4 rows created. 

SCOTT@orcl 07-OCT-14>select * from test; 

DEPTNO DNAME LOC 
---------- -------------- ------------- 
80 ACCOUNTING NEW YORK 
20 RESEARCH DALLAS 
30 SALES CHICAGO 
40 OPERATIONS BOSTON

SYS@orcl 07-OCT-14>select file_id,block_id,bytes from dba_extents where segment_name='TEST'; 

FILE_ID BLOCK_ID BYTES 
---------- ---------- ---------- 
4                 576         65536 

可以看到一个表test占用了64k的空间,从4号文件的576号块开始。
下面将该表重命名为test_rename:
SYS@orcl 07-OCT-14>alter table scott.test rename to test_rename; 

Table altered.

SYS@orcl 07-OCT-14>select file_id,block_id,bytes from dba_extents where segment_name='TEST_RENAME'; 

FILE_ID BLOCK_ID BYTES 
---------- ---------- ---------- 
4 576 65536

已经在内部将drop table命令映射到rename命令,它将作用于表及其所有相关的索引,触发器和约束,但不包括外键约束。必须物理删除外键约束。
就常规的DML和select语句而言,删除的表肯定是被删除了。但既然drop实际上是rename,就有可能撤销删除----通过将表重命名回它原先的名称。但是,并不能保证这样总是能成功。因为删除的表占用的空间有可能被重用,并且还会出现更复杂的情况,比如在此期间创建了另一张表,并且重用了与删除的表相同的名称。
通过查看回收站获取它们的新名称可以查询删除的对象。这里列出已删除的所有对象,并将原始表和索引名称映射到删除对象的系统生成的名称。
每个用户都有一个回收站,可以在USER_RECYCLEBIN数据字典视图中看到它,若要了解全局视图,可以从查询
DBA_RECYCLEBIN.
当表空间的空间不足时,可以自动重用回收站对象占用的空间(此后不能恢复对象),或者可以手动强制oracle使用purge命令删除对象。
注意:使用flashback drop不能保证成功执行,但是很可能会生效,越早执行该命令,成功的可能性就越大。


使用闪回删除:
drop命令将表重新命名为系统生成的名称,闪回删除可以恢复它。
使用各种语法如下:
SQL>drop table purge;
SQL>flashback table to before drop rename to ;



第一条命令会真正删除表。 purge关键字指示oracle恢复drop的原始含义:删除该表的所有引用并且永远无法恢复。

第二条命令将闪回该表重新命名。这样做是有必要的,以防在删除和闪回期间建立了另一个与删除表具有相同名称的表。
注意,尽管在闪回期间可以对表重命名,但不能更改模式:所有闪回操作出现在对象所属的模式内。

强调两点:
1.flashback drop只能在执行drop命令后恢复,而不能恢复truncate命令。
2.如果删除了一个用户,那么使用闪回将无法恢复该用户的任何表。


SQL*PLUS命令SHOW RECYCLEBIN将显示所有删除的对象:


连同它们的原始名称,回收站的名称。DBA_RECYCLEBIN视图提供了相同甚至更多的信息。

下面通过实验演示如何使用闪回删除:创建一个新的模式,并在该模式内建立一张表,然后使用flashback drop恢复它。
(1)新建一个用户dropper
SYS@orcl  07-OCT-14>create user dropper identified by dropper; 

User created. 

SYS@orcl  07-OCT-14>grant create session,resource to dropper; 

Grant succeeded. 

SYS@orcl  07-OCT-14>conn dropper/dropper 
Connected.

(2)创建一个带有索引和约束的表,并插入一行:
DROPPER@orcl  07-OCT-14>create table names (name varchar2(10)); 

Table created. 

DROPPER@orcl  07-OCT-14>create index name_idx on names(name); 

Index created. 

DROPPER@orcl  07-OCT-14>alter table names add (constraint name_u unique(name)); 

Table altered. 

DROPPER@orcl  07-OCT-14>insert into names values('John'); 

1 row created. 

DROPPER@orcl  07-OCT-14>commit; 

Commit complete. 

(3)确认模式的内容:
DROPPER@orcl  07-OCT-14>col object_name for a30 
DROPPER@orcl  07-OCT-14>select object_name,object_type from user_objects; 

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------------- 
NAME_IDX            INDEX 
NAMES                 TABLE 

DROPPER@orcl  07-OCT-14>select constraint_name,constraint_type,table_name from user_constraints; 

CONSTRAINT_NAME C TABLE_NAME 
------------------------------ - ------------------------------ 
NAME_U U NAMES 


(4)删除该表:
DROPPER@orcl  07-OCT-14>drop table names; 

Table dropped.

(5)再次确认模式内容:
DROPPER@orcl  07-OCT-14>select object_name,object_type from user_objects; 

no rows selected 

DROPPER@orcl  07-OCT-14>select constraint_name,constraint_type,table_name from user_constraints; 

CONSTRAINT_NAME C TABLE_NAME 
------------------------------ - ------------------------------ 
BIN$BOA+C8etmCfgUAB/AQB5YA==$0 U BIN$BOA+C8evmCfgUAB/AQB5YA==$0 

注意,已经从user_objects中删除了对象,但是在查询其表上的约束时,发现仍然采用系统生成的名称的约束。

(6)查询回收站以查看原始的名称到回收站的名称的映射:
DROPPER@orcl  07-OCT-14>select object_name,original_name,type from user_recyclebin; 

OBJECT_NAME                                                  ORIGINAL_NAME                                       TYPE 
------------------------------ ---------                 --------            --------------- ------------------------- 
BIN$BOA+C8eumCfgUAB/AQB5YA==$0        NAME_IDX                                                  INDEX 
BIN$BOA+C8evmCfgUAB/AQB5YA==$0         NAMES                                                       TABLE

(7)以下表明可以查询回收站但是无法对其进行DML操作,注意必须将表名称包含在双引号内,以便允许SQL*PLUS正确解析非标准字符:
DROPPER@orcl  07-OCT-14>select * from "BIN$BOA+C8evmCfgUAB/AQB5YA==$0"; 

NAME 
---------- 
John 

DROPPER@orcl  07-OCT-14>insert into "BIN$BOA+C8evmCfgUAB/AQB5YA==$0" values('Mary'); 
insert into "BIN$BOA+C8evmCfgUAB/AQB5YA==$0" values('Mary') 

ERROR at line 1: 
ORA-38301: can not perform DDL/DML over objects in Recycle Bin 

(8)使用flashback drop恢复表:
DROPPER@orcl  07-OCT-14> flashback table names to before drop; 

Flashback complete.

(9)重新查询模式内容和回收站中的内容:
DROPPER@orcl  07-OCT-14>select object_name,object_type from user_objects; 

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------------- 
BIN$BOA+C8eumCfgUAB/AQB5YA==$0 INDEX 
NAMES TABLE 

DROPPER@orcl  07-OCT-14>select constraint_name,constraint_type,table_name from user_constraints; 

CONSTRAINT_NAME C TABLE_NAME 
------------------------------ - ------------------------------ 
BIN$BOA+C8etmCfgUAB/AQB5YA==$0 U NAMES 

DROPPER@orcl  07-OCT-14>select object_name,original_name,type from user_recyclebin; 

no rows selected 

注意,索引和约束保留了它们在回收站中的名称。

(10)将索引和约束重命名为原先的名称:
DROPPER@orcl  07-OCT-14> alter index  "BIN$BOA+C8eumCfgUAB/AQB5YA==$0"  rename to  name_idx; 

Index altered.

DROPPER@orcl  07-OCT-14> alter table names rename constraint  "BIN$BOA+C8etmCfgUAB/AQB5YA==$0"  to  name_u; 

Table altered. 

(11)再次查询确认修改:
DROPPER@orcl  07-OCT-14>select object_name,object_type from user_objects; 

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------------- 
NAME_IDX INDEX 
NAMES TABLE 

DROPPER@orcl  07-OCT-14>select constraint_name,constraint_type,table_name from user_constraints; 

CONSTRAINT_NAME C TABLE_NAME 
------------------------------ - ------------------------------ 
NAME_U U NAMES

总结,如果误删除了表要flashback drop的话,在闪回完成之后,要对表上的索引和约束进行重命名以避免日后不必要的麻烦。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29800581/viewspace-1314238/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29800581/viewspace-1314238/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值