介绍

我们经常使用windows操作系统,在windows操作系统中,删除文件会先将文件移动到回收站中,然后打开回收站去确认删除或者还原。在Oracle数据库中,同样有回收站功能,我们可以启用回收站功能,来降低数据库中的数据被误删。

Oracle中的回收站功能,从用法上看跟windows系统的回收站类似,都能够彻底删除或者还原,而不同之处就在于,windows上的回收站存放的是文件,Oracle上的是存放的无效对象的定义。

Oracle采用数据字典表来存储被删除的表定义。

原理

Oracle启用回收站功能后,使用drop table ...语句删除一张表时,并不会将表给删除,而是以一定的格式重新对表重命名,然后将该表放到数据字典表中,在遇到表空间不足的情况下自动清理这些表,释放被占用的空间,让其它对象能够使用这些空间。

表删除后重命名格式为:

BIN$unique_id$version

说明:

  • $unique_id 该对象的全局唯一标识符,随机26个字符保证回收站中的对象是唯一的。
  • $version 数据库分配的版本号

清理回收站

虽然Oracle会在空间不足的时候自动清理表,但有时候也由于各种各样的原因我们需要手动清理。另外需要说明,如果回收站中存在大量的无效表或对象,对我们的数据库性能也有一定的影响。

你可以通过命令清理全库、指定表空间、指定用户下的表空间、当前用户下的数据库对象、表以及索引等(指定的数据库对象),这些粒度足够在你的生产环境中使用。

在清理表粒度时,如果在回收站中有同样名称的对象,就可以使用Oracle重命名后的表名来删除。

清理全库回收站

清理全库回收站中的无效对象时,需要使用sysdba用户去执行命令。

进入sqlplus命令窗口

[oracle@localhost ~]$ sqlplus / as sysdba

清理全库回收站

SQL> purge dba_recyclebin;

清理指定表空间的回收站对象

在测试中使用此命令清理users表空间中的无效对象没有生效。

清理

PURGE TABLESPACE USERS;

清理指定用户的表空间中的回收站对象

清理

PURGE TABLESPACE USERS user scott;

清理当前用户回收站

清理当前用户回收站

purge user_recyclebin;

清理指定表

清理指定表

purge table scott.bonus2;