PURGE DBA_RECYCLEBIN需DBA或SYSDBA权限,清空当前容器所有用户回收站,不可逆释放段空间但不缩文件,跨PDB需切换容器,不支持WHERE过滤,ORA-38301多因对象被引用或大分区阻塞。
执行 PURGE DBA_RECYCLEBIN 前必须确认权限和影响
普通用户没权限跑这个命令,必须是 dba 角色或拥有 sysdba 权限的账户。用 select * from session_roles; 确认当前会话是否含 dba;如果报错 ora-01031: insufficient privileges,别硬试,先找 dba 授权。
这个操作不可逆——回收站里所有对象(表、索引、约束等)的段空间立刻释放,且无法通过 FLASHBACK TABLE 恢复。不是“清空回收站界面”,而是直接从数据文件里抹掉段头块和 Extent 信息。
- 只对当前容器(CDB 或 PDB)生效,跨容器需分别执行
- 不释放临时段、undo 段、大对象(LOB)的独立存储段(除非该 LOB 属于被删表)
- 若表带
ENABLE ROW MOVEMENT或有物化视图日志,仍照常清除,但不会清理关联日志对象(得单独DROP MATERIALIZED VIEW LOG)
PURGE DBA_RECYCLEBIN 和 PURGE RECYCLEBIN 的区别在哪
PURGE RECYCLEBIN 只清当前用户的回收站(即 USER_RECYCLEBIN),而 PURGE DBA_RECYCLEBIN 扫描整个数据库所有用户的回收站条目。后者实际执行的是对 DBA_RECYCLEBIN 视图中每一行调用底层 purge_object 操作,耗时与回收站总对象数正相关。
典型误操作:在多租户环境里,用 sys 连 CDB$ROOT 执行 PURGE DBA_RECYCLEBIN,结果把所有 PDB 里的回收站也一并清了——因为 CDB 级的 DBA_RECYCLEBIN 默认包含所有容器。真要分治,得先 ALTER SESSION SET CONTAINER = pdb_name; 再执行。
-
PURGE DBA_RECYCLEBIN不接受 WHERE 条件,不能按用户名或对象名过滤 - 想精准清理某用户回收站?用
PURGE USER username;(需DBA权限) - 清理单个对象?查
DBA_RECYCLEBIN得到OBJECT_NAME(注意是回收站里的伪名,如BIN$abc123...),再PURGE TABLE "BIN$abc123...";
空间没立刻释放?检查段是否真被标记为可重用
执行成功后,DBA_SEGMENTS 里对应段记录消失,但数据文件物理空间不一定马上返还给操作系统。Oracle 只是把那些 Extent 标记为“可分配”,下次建表/插入时复用,而不是主动 shrink 数据文件。
常见假象:df -h 看数据文件所在磁盘没变小,就以为没清干净。其实得查 dba_free_space 或用 SELECT SUM(bytes)/1024/1024 FROM dba_free_space WHERE tablespace_name = 'USERS'; 确认表空间空闲字节数是否上涨。
- 如果表空间是
AUTOEXTEND ON,文件可能继续增长,旧空间只是“内部可用”,不影响新分配 - 想真正缩容?得配合
ALTER DATABASE DATAFILE ... RESIZE或ALTER TABLESPACE ... SHRINK SPACE(后者仅限 LMT + ASSM) - 归档模式下,即使段删了,对应的归档日志仍保留(除非手动删除或 RMAN 清理)
为什么 PURGE DBA_RECYCLEBIN 有时卡住或报 ORA-38301
ORA-38301 通常不是权限问题,而是目标对象正被其他会话引用:比如某个被删表的索引还在被隐式使用(如函数索引依赖的 PL/SQL 包未重新编译),或该表是物化视图基表且物化视图处于 NEVER REFRESH 状态但仍有依赖关系。
另一个常见卡点是回收站里有超大分区表——Oracle 会逐个清理每个分区段,期间持有 DX(Distributed Transaction)锁,若系统负载高或存在长事务,容易阻塞。
- 查阻塞源:
SELECT * FROM V$LOCK WHERE TYPE = 'DX';配合V$SESSION定位会话 - 避免高峰期执行;可先
SELECT owner, original_name, type, space FROM DBA_RECYCLEBIN ORDER BY space DESC排查大对象 - 若卡在某对象,用
PURGE TABLE "BIN$xxx"单独处理,比全量更可控
事情说清了就结束。最常被忽略的是容器上下文和空间释放的延迟性——命令返回成功不等于磁盘变小,也不等于所有 PDB 都被清理到了。










