Oracle中的回收站(Recycle Bin)

什么是Recycle Bin
回收站(Recycle Bin)实际上是包含删除对象信息的数据字典表。删除表和其他相关对象,比如索引、约束和嵌套表,实际上没有被真的删除,还是继续占用空间。直到被从回收站中purged出去,才能从数据库释放相关的表空间的空间。
每个用户可以拥有自己的回收站,当然除非用户拥有SYSDBA权限,否则默认都只可以访问用户所属的回收站。
可以通过下列语句,查看在回收站中自己的对象:
select * from recyclebin;
特别需要注意的是:在sys下drop的表是不记录recyclebin的。

 

闪回删除和回收站的关系
recyclebin1
使用Flashback Table命令,可以在无需使用时间点恢复的情况下,还原drop table语句的结果。
由初始化参数REECYCLEBIN用于控制闪回删除功能是打开(on)还是关闭(off)。如果是off,则删除的表不会进入回收站。如果是on,则删除的表将进入回收站,并且可能可以恢复(取决于是否还被保留)。默认情况下,不管10g和11g中。RECYCLEBIN设置为ON。

 

recyclebin2
如果不启用回收站,则删除表时,与该表及其从属对象关联的空间会立即变为可回收。
如果启用了回收站,则删除表时,与该表及其从属对象管理的空间不会立即变为可回收。即使该空间确实显示在dba_free_space中。相反,会在回收站中引用删除的对象,这些对象仍属于其各自的所有者。在空间不紧张时,绝不会把回收站对象使用的快乐自动回收。从而可以尽可能长的期限内恢复回收站的对象。

 

回收站中对象的命名
将删除的表“移动”到回收站时,将使用系统生成的名称对该表机器关联对象和约束条件进行重命名。
这样做的好处是避免以下情况:
用户删除表后,又用相同的名重建,又再删除。
两个用户使用相同的表名,但又都删除这些表。
重命名惯例如下:BIN$unique_id$version。
其中unique_id是该对象的全局唯一标识符,包含26个字符,用于在所有数据库之间的唯一的标识回收站名称。
而version是数据库分配的版本号。

 

回收站:自动回收空间
recyclebin3
只要回收站对象使用的空间没有被回收,就可以使用闪回删除功能恢复这些对象。
下面是回收站对象的回收策略:
显式发出purge命令时执行手动清理
空间不足时执行自动清除:对象在回收站中时,DBA_FREE_SPACE也会报告其对应的空间,因为这些空间是可以自动回收的。然后按以下顺序使用特定表空间中的空闲空间:
1.与回收站对象不对应的空闲空间
2.与回收站对象对应的空闲空间。在这种情况下,将使用先进先出(FIFO)算法自动将回收站对象从回收站清理
3.自动分配的空闲空间。

 

回收站管理

启停回收站
停用回收站
ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
启用回收站
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
注意:上述操作都需要重启数据库生效。

 

查看和查询回收站中的对象
试图 描述
USER_RECYCLEBIN 用户查看回收站中自身删除的对象,也可用通过同义词recyclebin查看。
DBA_RECYCLEBIN 管理员查看回收站中所有的删除对象。

 

查看回收站中中的对象
select original_name, object_name, ts_name, droptime from dba_recyclebin
SQL> show recyclebin  –不显示索引
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
—————- —————————— ———— ——————-
PP               BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:30:15
PP               BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:16:25
PP               BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 TABLE        2014-03-30:23:21:34
查询回收站中的对象,但是必须要用””指定正确回收站中的对象名
SQL> select * from “BIN$9dV9fqwGE+TgQwEAAH/i4w==$0”;

 

回收站:手动回收空间
使用PURGE命令可从回收站中永久地删除对象。从回收站中清除某个对象时,会从数据库中永久地删除该对象及其从属对象。因此,将无法再使用闪回删除功能恢复从回收站中清除的对象。
下面是可能使用的一些PURGE命令:
清除指定表和索引
PURGE {TABLE <table_name>|INDEX <index_name>}
示范:
purge table “BIN$9dV9fqwGE+TgQwEAAH/i4w==$0”;
purge table table_name;
purge index index_name;
清除驻留在指定表空间中的所有对象(也可能清楚从属、驻留在其它表空间中的对象)
PURGE TABLESPACE <ts_name> [USER <user_name>]
示范:
purge tablespace test;
purge tablespace test user z;
清除属于当前用户的所有对象或者清除所有对象(dba_recyclenbin,必须具有足够的系统权限或者sysdba权限)
PURGE [USER_|DBA_]RECYCLEBIN

 

不使用回收站
drop table <table_name> [purge];
表空间中的对象不会移到回收站中,且回收站中所属该表空间的对象也会被清理。
drop tablespace <ts_name> [including contents]
从数据库中永久地删除该用户及其拥有的所有对象。且回收站中所属的已删除用户的所有对象都将被清理。
drop user <user_name> [cascade]

 

从回收站回复表
使用flashback table…to before drop语句从回收站恢复对象。你可以指点回收站中的对象名,也可以指定原始表名。
rename to子句选项可以使恢复的时候重命名。
语法:
FLASHBACK TABLE <table_name> TO BEFORE DROP
[RENAME TO <new_name>];
示范:
在恢复前,先查询,所需要的信息
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
—————- —————————— ———— ——————-
PP               BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:30:15
PP               BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:16:25
PP               BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 TABLE        2014-03-30:23:21:34
或者
SQL> select object_name, original_name, createtime from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:16:19
BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 PP                               2014-03-30:23:21:28
BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:30:13
使用如下命令恢复表:
flashback table pp to before drop rename to zzz;
SQL> select object_name, original_name, createtime from recyclebin; 

OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:16:19
BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 PP                               2014-03-30:23:21:28

我们可以看出,恢复的表是最后被删除的,但是这个表不是我们实际需要的,怎么办?
还可以使用回收站中的对象名:
flashback table “BIN$9dV9fqwGE+TgQwEAAH/i4w==$0” to before drop;

 

恢复依赖对象
注意:恢复删除的表时,恢复的索引、触发器和约束条件将保留各自的回收站名称。因此,建议在闪回删除表前查询回收站和DBA_CONSTRAINTS。
1、在闪回之前,必须要先查询好表的相关信息
SQL>  select object_name, original_name, createtime from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9daqMpoEFoLgQwEAAH/mBQ==$0 IDX_PPP_02                       2014-03-31:00:45:01
BIN$9daqMpoFFoLgQwEAAH/mBQ==$0 IDX_PPP_01                       2014-03-31:00:45:14
BIN$9daqMpoGFoLgQwEAAH/mBQ==$0 PP                               2014-03-31:00:44:32
2、恢复表
SQL> flashback table pp to before drop;
3、查询在回收站中恢复表对应关联对象
SQL> select index_name from user_indexes where table_name=’PP’;
INDEX_NAME
——————————
BIN$9daqMpoFFoLgQwEAAH/mBQ==$0
BIN$9daqMpoEFoLgQwEAAH/mBQ==$0
4、重命名到正确的对象名
alter index “BIN$9daqMpoFFoLgQwEAAH/mBQ==$0” rename to IDX_PPP_01;
alter index “BIN$9daqMpoEFoLgQwEAAH/mBQ==$0” rename to IDX_PPP_02;

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*