背景知识
回收站(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博客 ” ,链接:https://blog.itpub.net/31448824/viewspace-2139392/ ,如需转载,请注明出处,否则将追究法律责任。