当前位置: 首页 > Oracle, oracle 11g > 正文

Oracle清理recyclebin的几种方法

有人在群里咨询Oracle数据库的回收站里的表太多了,直接使用PURGE RECYCLEBIN命令清理回收站非常慢,对数据库的性能存在一定的影响,有没有什么办法,可以分批进行清理。

在正常情况下,只要表空间可以扩展,也就是表空间还有可用空间,那么Oracle就不会清理回收站而释放空间。就好比在表空间充足的情况下,一张DELETE操作非常频繁的表,你会发现这张表会越来越大,碎片越来越多,那些被删除的数据释放的空间Oracle并不会被使用,这就导致明明表空间还有使用率,但数据文件一直在扩展,只有在数据文件无法扩展时,才会使用这部分空间。回收站也是一样,表空间充足时,不会释放回收站内对象占用的空间,只有当表空间比较紧张的时候,才会回收这部分空间。所以定期清理回收站还是很有必要的。

正好我维护的数据库也存在被删除后放在回收站里的表,可以进行案例演示。

SQL> select OWNER,OBJECT_NAME,ORIGINAL_NAME,TS_NAME,type from dba_recyclebin order by 4;

OWNER      OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME    TYPE
---------- ------------------------------ -------------------------------- ---------- ----------
CHGSHS     BIN$UXRgImw4c6/gU2gCAArT/g==$0 FUL_D_STOCK_H_TEMP0815           TS_BSC     TABLE
IVL_DEBUG  BIN$RBweIEQ5nv7gU2oCAArKJg==$0 LT_STOCK_DIFF                    USERS      TABLE
IVL_DEBUG  BIN$NvMZ2/SZHBjgU2ACAApZDA==$0 ORD_S_STOCK_TEMP                 USERS      TABLE
IVL_DEBUG  BIN$NvMZ2/SYHBjgU2ACAApZDA==$0 IDX_ORD_S_STOCK_TEMP_01          USERS      INDEX
… …
CHGSHS     BIN$UXRVT29MbWvgU2gCAArvKQ==$0 IX_WMS_TB_WH_DAILY_201508_02     USERS      INDEX
CHGSHS     BIN$UXRVT29NbWvgU2gCAArvKQ==$0 WMS_TB_WH_DAILY_201508           USERS      TABLE
CHGSHS     BIN$UXRVT29LbWvgU2gCAArvKQ==$0 IX_WMS_TB_WH_DAILY_201508_01     USERS      INDEX

105 rows selected.

DBA_RECYCLEBIN可以查看到当前数据库中所有回收站中的对象,USER_RECYCLEBIN和RECYCLEBIN只能看到当前用户下回收站中的对象,正常情况下,普通用户只能清理自己的回收站,DBA权限的用户可以清理所有用户的回收站。

可以按照表级别进行清理,只清理指定的表,可以通过表的名字进行清理,也可以按照回收站中的名字进行清理。

SQL> purge table chgshs.WMS_TB_WH_DAILY_201508;

Table purged.
SQL> purge table chgshs.”BIN$UXRVT29MbWvgU2gCAArvKQ==$0”;

Table purged.

可以直接清理掉指定用户在不同表空间中的对象,比如清理CHGSHS用户在USERS表空间里的所有对象,当然这里指的是已经在回收站里的被删除的对象,没有被删除到回收站的对象是不会被清理掉的。

SQL> purge tablespace users user CHGSHS;

Tablespace purged.

这样,CHGSHS用户的回收站中,存在于USERS表空间的对象就全部被清理掉了,在回收站中已经查询不到这些对象了。

SQL> select OWNER,OBJECT_NAME,ORIGINAL_NAME,TS_NAME,type from dba_recyclebin where owner='CHGSHS' and ts_name='USERS' order by 4;

no rows selected

可以按照表空间进行清理,这样会清理掉回收站中,所有存在于指定表空间中的对象,不管是哪个用户下的对象,只要存在于这个表空间,就全部被清理掉。比如,清理USERS表空间下的所有回收站中的对象。

SQL> purge tablespace users;

Tablespace purged.

这样,回收站中存在于USERS表空间中的所有对象,就都被清理掉了。

SQL> select OWNER,OBJECT_NAME,ORIGINAL_NAME,TS_NAME,type from dba_recyclebin where ts_name='USERS' order by 4;

no rows selected

可以按照用户级别进行清理,这样会清理掉这个用户下面的所有回收站的信息。但是这个操作只能在当前用户下执行,不存在PURGE USER这样的语法。下面清理CHGSHS用户下的所有回收站中的对象。

SQL> conn chgshs
Enter password: 
Connected.
SQL> purge recyclebin;

Recyclebin purged.

这样CHGSHS用户下的所有回收站中的对象就被清理掉了。下面简单介绍下查询回收站信息的几种方法。

SELECT * FROM RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN;
SHOW RECYCLEBIN;

上面这三种方法效果是一样的,都是查询当前用户下的回收站信息,只能看到属于这个用户的回收站数据,看不到其他用户的回收站数据,最常用的就是SHOW RECYCLEBIN命令,毕竟这个命名会少敲好几下键盘。

SELECT * FROM DBA_RECYCLEBIN;

这个命令只能是DBA权限的用户使用,可以查询数据库中所有在回收站中的信息,也很常用。

以上几种清理回收站的操作,需要根据需求,选择适合的操作,如果回收站中的对象实在太多,而且又不想对性能造成影响,最好的方法是写一个脚本或者存储过程,慢慢去清理,毕竟清理回收站操作基本上是没有对操作时间的要求的,如果表空间使用率很紧张,可以先清理比较大的对象,先释放出大对象占用的空间,然后再慢慢清理其他的对象。

本文固定链接: https://www.dbdream.com.cn/2017/09/oracle%e6%b8%85%e7%90%86recyclebin%e7%9a%84%e5%87%a0%e7%a7%8d%e6%96%b9%e6%b3%95/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2017年09月01日发表在 Oracle, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Oracle清理recyclebin的几种方法 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , ,

Oracle清理recyclebin的几种方法:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter