PURGE DBA_RECYCLEBIN是释放回收站段空间的唯一可靠方式,需SYSDBA权限并在目标容器中执行,否则仅清理当前用户或CDB$ROOT内容;df -h不变属正常,应查dba_free_space确认空闲空间增加。
PURGE DBA_RECYCLEBIN 是释放段空间的唯一可靠方式
想真正让 dba_segments 里那些 bin$xxx 段消失、把空间还给表空间,必须用 purge dba_recyclebin。只跑 purge recyclebin 永远清不干净——它只动当前用户自己的回收站条目,哪怕你用 sys / as sysdba 登录,默认也只清 cdb$root 里 sys 用户的那几条。
常见误操作:
- 开发账号执行
PURGE RECYCLEBIN→ 只清自己 DROP 的表,应用账号或 DBA 账号的回收站还在占空间 - 在 CDB$ROOT 下用 sys 执行
PURGE DBA_RECYCLEBIN→ 把所有 PDB 的回收站全清了(因为 CDB 级DBA_RECYCLEBIN默认跨容器) - 没切容器就进 PDB 执行 → 命令根本找不到该 PDB 里的回收站对象
执行前必须确认权限和作用域
PURGE DBA_RECYCLEBIN 不是“有 DBA 角色就行”,而是硬性要求 SYSDBA 权限。普通 DBA 用户执行会直接报 ORA-01031: insufficient privileges,别试。
多租户环境下,必须先切换容器:
- 查当前容器:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL; - 切到目标 PDB:
ALTER SESSION SET CONTAINER = pdb_name; - 再执行
PURGE DBA_RECYCLEBIN
如果真要分治清理(比如只清某个 PDB),漏掉 ALTER SESSION 这步,命令就跑错地方了。
为什么 df -h 没变小?这不是命令失效
执行成功后,DBA_SEGMENTS 中对应 BIN$xxx 记录消失,说明段已被标记为可重用;但 df -h 看数据文件大小不变,是正常现象——Oracle 不 shrink 数据文件,只是把 Extent 加入空闲列表,等下次建表或插入时自动复用。
验证是否真释放了:
- 查空闲空间:
SELECT SUM(bytes)/1024/1024 FROM dba_free_space WHERE tablespace_name = 'USERS';(数值应上涨) - 查回收站残留:
SELECT COUNT(*) FROM dba_recyclebin;(应为 0) - 查 BIN 段占用:
SELECT tablespace_name, SUM(bytes)/1024/1024 AS mb FROM dba_segments WHERE segment_name LIKE 'BIN$%' GROUP BY tablespace_name;(结果应为空)
别用 WHERE 过滤,精准清理得换语法
PURGE DBA_RECYCLEBIN 不支持 WHERE 条件,写 PURGE DBA_RECYCLEBIN WHERE OWNER = 'SCOTT' 会直接报错。想按用户或表空间清理,得用其他语法:
- 清指定用户回收站:
PURGE USER scott;(需 DBA 权限) - 清指定表空间下所有回收站对象:
PURGE TABLESPACE users; - 清指定表空间 + 指定用户:
PURGE TABLESPACE users USER scott; - 清单个对象:
PURGE TABLE "BIN$abc123$0";(注意双引号 + 回收站名)
这些命令都比全库 PURGE DBA_RECYCLEBIN 更安全,尤其适合生产环境空间紧张但不想一刀切的场景。











