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权限的用户使用,可以查询数据库中所有在回收站中的信息,也很常用。
以上几种清理回收站的操作,需要根据需求,选择适合的操作,如果回收站中的对象实在太多,而且又不想对性能造成影响,最好的方法是写一个脚本或者存储过程,慢慢去清理,毕竟清理回收站操作基本上是没有对操作时间的要求的,如果表空间使用率很紧张,可以先清理比较大的对象,先释放出大对象占用的空间,然后再慢慢清理其他的对象。
【下一篇】PARTITION RANGE EMPTY是什么鬼