介绍
我们经常使用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;