recyclebin维护
ORACLE 10G 有了回收站,类似于WINDOWS下回收站,就是删除对象时,不会直接删除,会首先保留到回收站里,一般默认存在用户默认的表空间里,当数据库空间使用达到一定程度时,会自动DROP,由于HS应用的特点,一段时间后回收站里对象就很多,此时你就会发现,在运行统计表空间使用率的时候,或者相关操作时特别慢,有它一部分原因,一下介绍下简单维护
1 回收站的相关视图
dba_recyclebin :数据库所有用户删除的对象都会在此查询到
user_recyclebin:当前用户下删除对象可以在此查询到
注意:SYS SYSTEM等系统用户删除对象是不会保留的,直接删除了,所以用以上用户操作时注意了。,也尽量避免用以上用户操作
以下几种drop不会将相关对象放进RecycleBin:
- drop tablespace:会将RecycleBin中所有属于该tablespace的对象清除
- drop user:会将RecycleBin中所有属于该用户的对象清除
- drop cluster:会将RecycleBin中所有属于该cluster的成员对象清除
- drop type:会将RecycleBin中所有依赖该type的对象清除
RecycleBin中的对象会被系统自动按照规则重命名,这是为了防止命名冲突。命名格式为:BIN$unique_id$version
其中unique_id是26个字符的对象唯一标识符,version则是对象在数据库中的版本号。
1* select owner,ORIGINAL_NAME,operation,droptime,partition_name,space,type from dba_recyclebin
SQL> /
OWNER ORIGINAL_NAME OPERATION DROPTIME PARTITION_NAME SPACE TYPE
—————————— ——————————– ——— ——————- ——————————– ———- ————————-
HS_USER IDX_USEROPERLOG_OPER DROP 2008-12-22:09:51:12 2432 INDEX
HS_USER IDX_USEROPERLOG DROP 2008-12-22:09:51:12 3200 INDEX
HS_USER IDX_USEROPERLOG_BRAN DROP 2008-12-22:09:51:12 3200 INDEX
HS_USER USEROPERLOG DROP 2008-12-22:09:51:12 14336 TABLE
HS_SECU IDX_ENTRUST DROP 2008-12-18:19:07:24 512 INDEX
HS_SECU IDX_ENTRUST_BATCH DROP 2008-12-18:19:07:24 384 INDEX
HS_SECU IDX_ENTRUST_FUND DROP 2008-12-18:19:07:24 384 INDEX
HS_SECU IDX_ENTRUST_STKCACCT DROP 2008-12-18:19:07:24 768 INDEX
HS_SECU ENTRUST DROP 2008-12-18:19:07:24 2816 TABLE
HS_SECU IDX_ENTRUST DROP 2008-12-22:20:14:29 8 INDEX
HS_SECU IDX_ENTRUST_BATCH DROP 2008-12-22:20:14:29 8 INDEX
OWNER ORIGINAL_NAME OPERATION DROPTIME PARTITION_NAME SPACE TYPE
—————————— ——————————– ——— ——————- ——————————– ———- ————————-
HS_SECU IDX_ENTRUST_FUND DROP 2008-12-22:20:14:29 8 INDEX
HS_SECU IDX_ENTRUST_STKCACCT DROP 2008-12-22:20:14:29 8 INDEX
HS_SECU IDX_ENTRUST_REPORT DROP 2008-12-22:20:14:29 8 INDEX
HS_SECU ENTRUST DROP 2008-12-22:20:14:29 8 TABLE
HS_FUND IDX_FUNDSERIALCOUNTER DROP 2008-12-22:20:12:46 8 INDEX
HS_FUND FUNDSERIALCOUNTER DROP 2008-12-22:20:12:46 8 TABLE
HS_FUND IDX_FUNDREALJOUR DROP 2008-12-22:20:13:33 8 INDEX
HS_FUND IDX_FUNDREALJOUR_ACCT DROP 2008-12-22:20:13:33 8 INDEX
HS_FUND FUNDREALJOUR DROP 2008-12-22:20:13:34 8 TABLE
2 回收站的清理
删除当前用户下所有回收站的对象
purge user_recyclebin.
删除单个对象
删除所有用户下的回收站对象
purge dba_recyclebin
删除指定表空间里的对象
purge tablespace user boson test_recyclebin
单独删除和恢复对象注意一些约束,比如索引
SQL> purge index hs_user. IDX_USEROPERLOG_OPER
2 ;
Index purged.3 打开回收站的原因就是,避免误操作DROP对象时,可以恢复
一下介绍下简单的恢复例子
SQL> conn boson/boson
Connected.
SQL> create table test_recyclebin (a number,b varchar2(40));
Table created.
SQL> insert into test_recyclebin values (1,’one rows’);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test_recyclebin;
A B
———- —————————————-
1 one rows
SQL> drop table test_recyclebin; (此处模拟表的DROP操作)
Table dropped.
SQL> select * from test_recyclebin; (可以确认表已经被DROP了)
select * from test_recyclebin
*
ERROR at line 1:
ORA-00942: table or view does not exist
删除所有用户下的回收站对象
purge dba_recyclebin
删除指定表空间里的对象
purge tablespace user boson test_recyclebin
单独删除和恢复对象注意一些约束,比如索引
1* select ORIGINAL_NAME,operation,droptime,partition_name,space,type from user_recyclebin (回收站里可以查询到对象)
SQL> /
ORIGINAL_NAME OPERATION DROPTIME PARTITION_NAME SPACE TYPE
——————————– ——— ——————- ——————————– ———- ————————-
TEST_RECYCLEBIN DROP 2008-12-24:16:10:23 16 TABLE
SQL> flashback table test_recyclebin to before drop; (恢复此表)
Flashback complete.
SQL> select * from test_recyclebin; (可以确认对象恢复了)
A B
———- —————————————-
1 one rows
可能有人问如果在DROP后,别人又创建了相同的名字,改怎么恢复呢?如何确定恢复那个呢?以下在给你演示下:
SQL> drop table test_recyclebin;(接着上边,先删除刚恢复的表)
Table dropped.
SQL> create table test_recyclebin (a number,b varchar2(40));
Table created.
SQL> insert into test_recyclebin values (1,’one rows’);
1 row created.
SQL> insert into test_recyclebin values (2,’two rows’);(为了和之前的表相区别,此处插入2行)
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test_recyclebin;
A B
———- —————————————-
1 one rows
2 two rows
SQL> drop table test_recyclebin;
Table dropped.
SQL> select ORIGINAL_NAME,operation,droptime,partition_name,space,type from user_recyclebin;
ORIGINAL_NAME OPERATION DROPTIME PARTITION_NAME SPACE TYPE
——————————– ——— ——————- ——————————– ———- ————————-
TEST_RECYCLEBIN DROP 2008-12-24:16:17:52 16 TABLE
TEST_RECYCLEBIN DROP 2008-12-24:16:19:29 16 TABLE
SQL> l
1* select ORIGINAL_NAME,operation,droptime,partition_name,space,type from user_recyclebin
SQL> c/operation/object_name,operation/
1* select ORIGINAL_NAME,object_name,operation,droptime,partition_name,space,type from user_recyclebin
SQL> /
ORIGINAL_NAME OBJECT_NAME OPERATION DROPTIME PARTITION_NAME SPACE TYPE
——————————– —————————— ——— ——————- ——————————– ———- ————————-
TEST_RECYCLEBIN BIN$XsZsdTnBBM3gRAAbeHwkqA==$0 DROP 2008-12-24:16:17:52 16 TABLE
TEST_RECYCLEBIN BIN$XsZsdTnCBM3gRAAbeHwkqA==$0 DROP 2008-12-24:16:19:29 16 TABLE
在回收战里可以看到两条信息,original_name一致,但是object_name droptime以及还有其他选项不一致,以此来区别,要恢复那个表,此处恢复的时候可以使用object_name了
比如我们想恢复,第一次删除的表,
SQL> flashback table “BIN$XsZsdTnBBM3gRAAbeHwkqA==$0″ to before drop;
Flashback complete.
SQL> select * from test_recyclebin;
A B
———- —————————————-
1 one rows 到此可以确认我们恢复的是第一次删除的表,注意用OBJECT_NAME时,需要用双引号
恢复第二次删除的表,因为数据库里已经有test_recyclebin的表了,所以恢复的时候需要重命名
SQL> flashback table “BIN$XsZsdTnCBM3gRAAbeHwkqA==$0″ to before drop rename to test_recyclebin_2;
Flashback complete.
SQL> select * from test_recyclebin_2;
A B
———- —————————————-
1 one rows
2 two rows
SQL> select ORIGINAL_NAME,object_name,operation,droptime,partition_name,space,type from user_recyclebin;
no rows selected
回收站里已经没有对象了
4 回收站的禁用
alter system set recyclebin=off scope=spfile;
以上仅作参考,慎重.更详细的内容请看ORACLE官方文档