PURGE RECYCLEBIN仅清当前用户回收站,不释放全库空间;真正释放需SYSDBA权限执行PURGE DBA_RECYCLEBIN,该操作不可逆,立即清除所有用户回收站段并使其进入表空间空闲列表。

PURGE RECYCLEBIN 不会释放全库空间,只清当前用户对象;真正清理需用 SYSDBA 执行 PURGE DBA_RECYCLEBIN,且不可逆。
为什么 PURGE RECYCLEBIN 后表空间没释放?
执行 PURGE RECYCLEBIN 后发现 df -h 或 DBA_SEGMENTS 中空间未减少,不是命令失效,而是作用范围太小:
- 该命令仅清空当前登录用户的
USER_RECYCLEBIN,哪怕你用sys登录,只要没切容器(ALTER SESSION SET CONTAINER = pdb_name),在CDB$ROOT下执行也只清sys自己的回收站条目 - 多租户环境下,各 PDB 的回收站完全独立,
CDB$ROOT中执行不触碰任何 PDB 里的BIN$xxx$0段 - 普通开发账号执行后,DBA 账号或应用账号的回收站仍占空间,查
DBA_RECYCLEBIN可能仍有几百条记录
PURGE DBA_RECYCLEBIN 必须用 SYSDBA 权限
想真正释放全库回收站占用的空间,必须满足两个硬性条件:
- 登录账户需具备
SYSDBA权限(仅带DBA角色不够),否则报ORA-01031: insufficient privileges - 命令不支持
WHERE过滤,不能写成PURGE DBA_RECYCLEBIN WHERE OWNER = 'SCOTT';如需按用户清理,改用PURGE USER scott - 执行后所有回收站段立即从
DBA_SEGMENTS消失,空间进入对应表空间空闲列表,但不会返还给操作系统
确认回收站是否清空的可靠方法
别只信“命令执行成功”,要查数据字典验证:
- 当前用户是否清空:执行
SELECT COUNT(*) FROM USER_RECYCLEBIN,结果应为0 - 段是否真正释放:查
SELECT segment_name, tablespace_name FROM DBA_SEGMENTS WHERE segment_name LIKE 'BIN\$%' AND ROWNUM ,有返回说明还有残留 - 空间是否可复用:查
SELECT tablespace_name, SUM(bytes)/1024/1024 AS mb FROM DBA_SEGMENTS WHERE segment_name LIKE 'BIN\$%' GROUP BY tablespace_name,对比清理前后数值
容易被忽略的关键细节
回收站对象虽已重命名,但物理段仍在原表空间里——这正是它还在占空间的直接证据。而 FLASHBACK TABLE ... TO BEFORE DROP 在 PURGE 后彻底失效,且 PURGE 不触发任何触发器、不写归档日志、不产生 undo。如果数据库启用了闪回数据归档(FDA)或长期运行大量 DDL,回收站可能积压数月未清理,建议结合 DBA_RECYCLEBIN.DROP_TIME 定期巡检老化对象。











