Oracle回收站未清空会导致空间不释放,需查BIN$段、确认recyclebin开启、PURGE前验权限/容器/锁,清空后表空间空闲空间增加但文件不缩容。

确认回收站确实在吃空间
执行 DROP TABLE 后磁盘没变大、df -h 无变化,不代表空间已释放。Oracle 11g 默认开启 recyclebin,删表只是重命名成 BIN$xxx 并留在原表空间里,段仍被 DBA_SEGMENTS 计入。必须查真实占用:
SELECT tablespace_name, SUM(bytes)/1024/1024/1024 AS gb FROM dba_segments WHERE segment_name LIKE 'BIN$%' GROUP BY tablespace_name;- 再比对
SELECT * FROM dba_recyclebin WHERE type = 'TABLE';看对象数量和ORIGINAL_NAME -
SHOW PARAMETER recyclebin;确认值为ON,否则不会进回收站
PURGE DBA_RECYCLEBIN 执行前必查三件事
这个命令看似简单,但常因权限、容器或阻塞失败,且无报错就以为成功——实际可能跳过部分对象。
- 权限:必须用
SYS或带SYSDBA的用户;SELECT * FROM SESSION_ROLES;查不到DBA就会报ORA-01031 - 多租户环境:在
CDB$ROOT下执行会清掉所有 PDB 的回收站;要只清某个 PDB,先ALTER SESSION SET CONTAINER = pdb_name; - 对象被锁:若某
BIN$xxx正被其他会话查询或 DML,会报ORA-38301;查V$SESSION和V$LOCK定位并 kill 阻塞会话
清空后空间为什么还没还给操作系统?
PURGE DBA_RECYCLEBIN 成功后,DBA_SEGMENTS 里对应记录消失,说明段头和 extent 已标记为“可重用”,但数据文件物理尺寸不会自动缩小。
-
df -h不变是正常现象;真正要看的是表空间内部空闲度:SELECT SUM(bytes)/1024/1024 FROM dba_free_space WHERE tablespace_name = 'USERS';是否上涨 - 想把空间真正返还 OS,得手动
RESIZE数据文件,或对表空间执行ALTER TABLESPACE ... COALESCE;整理碎片后再 resize - 如果表空间启用了
AUTOEXTEND ON,旧空间只是“内部可用”,新插入仍优先复用,不会触发文件收缩
别依赖 PURGE RECYCLEBIN 清全库
PURGE RECYCLEBIN 只清当前用户(即 USER_RECYCLEBIN),不是“当前连接用户看到的所有回收站”。生产库中常见误判:
- 用普通应用用户连库,跑
PURGE RECYCLEBIN,结果 DBA 用户的BIN$表还在占空间 - 想清某用户全部回收站,该用
PURGE USER username;(需 DBA 权限),而不是PURGE RECYCLEBIN - 要清特定表但记不清
BIN$名,先查DBA_RECYCLEBIN拿准OBJECT_NAME,再PURGE TABLE "BIN$abc123==$0";(引号不能省,含特殊字符)
回收站空间释放的关键不在“清动作”本身,而在于清之前是否确认了对象归属、容器上下文和锁状态,以及清之后是否意识到 Oracle 的空间管理是“逻辑释放”而非“物理收缩”。PURGE 命令不可逆,执行前务必 double-check 对象名和当前容器。


















