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官方文档



评论暂缺

(Required)
(Required, will not be published)