闪回之 回收站、Flashback Drop (table、index、trigger等)

背景知识


回收站(recyclebin):从管理的角度为每个用户“分配”一个回收站,但这个回收站并不实际开辟空间(逻辑容器),当drop table时(非purge),原来的表所使用的段中的数据并没有真正的删除。实际上是把table的段名以回收站方式重命名。当发生空间不够时,Oracle 会按照先入先出的顺序覆盖 Recycle Bin 中的对象。该段所在表空间不足需要扩展时,回收站中的信息会被自动清除。


回收站开启与关闭:
-- recyclebin 为 on 表示开启
SQL> show parameter recyclebin


NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------
recyclebin                           string      on


--关闭
SQL> alter system set recyclebin=off;   (全局生效)
SQL> alter session set recyclebin=off;   (当前会话生效)


手动的删除 Recycle Bin 占用的空间:
1). Purge tablespace tablespace_name : 用于清空表空间的 Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin 中指定用户的对象
3). Purge recyclebin: 删除当前用户的 Recycle Bin 中的对象
4). Purge dba_recyclebin: 删除所有用户的 Recycle Bin 中的对象,该命令要sysdba 权限
5). Drop table table_name purge: 删除对象并且不放在 Recycle Bin 中,即永久的删除,不能用 Flashback 恢复。
6). Purge index recycle_bin_object_name: 当想释放 Recycle bin 的空间,
又想能恢复表时,可以通过释放该对象的 index 所占用的空间来缓解空间压力。 因为索引是可以重建的。sysdba 权限




Flashback Drop 是基于 Tablespace RecycleBin 来实现恢复的。 它只支持闪
回与 table 相关连的对象,比如表,索引,约束,触发器等。 如果是函数或者
存储过程等,就需要使用 Flashback Query 来实现。




Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不
会被放入 recycle bin,因此当你执行 flashback table to before drop 时,也不能恢
复依赖其的物化视图,需要 dba 手工介入重新创建。
5). 对于 Recycle Bin 中的对象,只支持查询.




一: Flashback Drop  操作流程    


模式一:drop table 后未新建同名表


SQL> create table flashdrop as select * from user_objects;


Table created.


SQL> create bitmap index ind_flashdrop  on flashdrop(object_type);


Index created.


SQL> drop table flashdrop;


Table dropped.
--查看 recyclebin 内的对象
SQL> select original_name,object_name,type,droptime from recyclebin;


ORIGINAL_NAME                    OBJECT_NAME                    TYPE                      DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
IND_FLASHDROP                    BIN$ESs42vP2YC3gUw0ZZAqeww==$0 INDEX                     2015-03-13:08:08:19
FLASHDROP                        BIN$ESs42vP3YC3gUw0ZZAqeww==$0 TABLE                     2015-03-13:08:08:19
SQL> flashback table flashdrop to before drop;


Flashback complete.


SQL> select original_name,object_name,type,droptime from recyclebin;


no rows selected
--查看索引名字
SQL> col column_name for a40
SQL>  SELECT index_name, column_name, descend  FROM user_ind_columns  WHERE table_name = 'FLASHDROP';


INDEX_NAME                     COLUMN_NAME                              DESC
------------------------------ ---------------------------------------- ----
BIN$ESs42vP2YC3gUw0ZZAqeww==$0 OBJECT_TYPE                              ASC
--索引改为原来的名字   (说明 闪回表 后,即使未给索引重命名,执行计划依然可以走索引)
SQL> alter index "BIN$ESs42vP2YC3gUw0ZZAqeww==$0" rename to IND_FLASHDROP;


Index altered.
--查看是否成功改名
SQL>  SELECT index_name, column_name, descend  FROM user_ind_columns  WHERE table_name = 'FLASHDROP';


INDEX_NAME                     COLUMN_NAME                              DESC
------------------------------ ---------------------------------------- ----
IND_FLASHDROP                  OBJECT_TYPE                              ASC


SQL> select count(*) from flashdrop;


  COUNT(*)
----------
        11
补充:
--查看表约束名
select CONSTRAINT_NAME,TABLE_NAME, COLUMN_NAME from user_cons_columns where TABLE_NAME='FLASHDROP';


模式二:drop table 后新建同名表


SQL> drop table flashdrop;


Table dropped.


SQL> create table flashdrop as select * from user_objects;


Table created.


SQL> select original_name,object_name,type,droptime from recyclebin;


ORIGINAL_NAME                    OBJECT_NAME                    TYPE                      DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
IND_FLASHDROP                    BIN$ESs42vP4YC3gUw0ZZAqeww==$0 INDEX                     2015-03-13:08:25:37
FLASHDROP                        BIN$ESs42vP5YC3gUw0ZZAqeww==$0 TABLE                     2015-03-13:08:25:37


SQL> flashback table flashdrop to before drop;
flashback table flashdrop to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object




SQL> flashback table flashdrop to before drop rename to flashtable;


Flashback complete.


SQL> select original_name,object_name,type,droptime from recyclebin;


no rows selected


SQL> select count(*) from flashtable;


  COUNT(*)
----------
        11


模式三:drop table 后新建同名表,再 drop 新同名表


SQL> select count(*) from flashdrop;


  COUNT(*)
----------
        13


SQL> drop table flashdrop;


Table dropped.


SQL> create table flashdrop as select * from user_objects;


Table created.


SQL> insert into flashdrop(object_name) values('andy');


1 row created.


SQL> select count(*) from flashdrop;


  COUNT(*)
----------
        14
SQL> drop table flashdrop;


Table dropped.


SQL> select original_name,object_name,type,droptime from recyclebin;


ORIGINAL_NAME                    OBJECT_NAME                    TYPE                      DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
FLASHDROP                        BIN$ESs42vP9YC3gUw0ZZAqeww==$0 TABLE                     2015-03-13:08:42:21
FLASHDROP                        BIN$ESs42vP+YC3gUw0ZZAqeww==$0 TABLE                     2015-03-13:08:56:16


SQL> select count(*) from "BIN$ESs42vP9YC3gUw0ZZAqeww==$0";


  COUNT(*)
----------
        13


SQL> select count(*) from "BIN$ESs42vP+YC3gUw0ZZAqeww==$0";


  COUNT(*)
----------
        14


SQL> flashback table "BIN$ESs42vP+YC3gUw0ZZAqeww==$0" to before drop;


Flashback complete.


SQL> select count(*) from flashdrop;


  COUNT(*)
----------
        14

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

转载于:http://blog.itpub.net/31448824/viewspace-2139392/

你可能感兴趣的:(闪回之 回收站、Flashback Drop (table、index、trigger等))