drop表后df -h无变化是因为oracle默认启用recyclebin,表被重命名至bin$并保留在原表空间,段未物理删除,数据文件尺寸不变。

为什么 DROP 表后 df -h 看不到磁盘空间增加
Oracle 11g 及以后版本默认开启 recyclebin,DROP TABLE 不是物理删除,而是把表重命名为 BIN$xxx==$0 并留在原表空间里。段(segment)仍被 DBA_SEGMENTS 统计,数据文件物理尺寸不变,所以 df -h 无变化是正常现象。
验证方式:
- 查回收站:
SELECT object_name, original_name, type FROM user_recyclebin; - 查真实段占用:
SELECT segment_name, bytes/1024/1024 MB FROM dba_segments WHERE segment_name LIKE 'BIN%'; - 确认开关:
SHOW PARAMETER recyclebin;—— 值为ON才会进回收站
PURGE DBA_RECYCLEBIN 执行前必须检查的三件事
这个命令看似一键清空,但常静默跳过对象,你以为清完了,其实没清干净。
-
权限不足:必须用
SYS或带SYSDBA的用户执行;普通用户跑会报ORA-01031: insufficient privileges,且不提示失败对象 -
多租户上下文错位:在
CDB$ROOT下执行会清掉所有 PDB 的回收站;若只想清某个 PDB,先ALTER SESSION SET CONTAINER = pdb_name; -
对象被锁住:某
BIN$xxx正被其他会话查询或 DML,会报ORA-38301: cannot perform DDL/DML over objects in Recycle Bin;需查V$SESSION和V$LOCK定位并KILL阻塞会话
清空后空间为什么还没还给操作系统
PURGE DBA_RECYCLEBIN 成功后,DBA_SEGMENTS 中对应记录消失,说明 extent 已标记为“可重用”,但数据文件本身不会自动缩小——这是 Oracle 的设计,不是 bug。
- 真正要看的是表空间内部空闲度:
SELECT SUM(bytes)/1024/1024 FROM dba_free_space WHERE tablespace_name = 'USERS';是否上涨 - 想把空间真正返还 OS,得手动
ALTER DATABASE DATAFILE '/path/to/file.dbf' RESIZE 500M;,或先ALTER TABLESPACE users COALESCE;整理碎片再 resize - 如果表空间启用了
AUTOEXTEND ON,旧空间只是“内部可用”,新插入仍优先复用,不会触发文件收缩
别混淆 PURGE RECYCLEBIN 和 PURGE DBA_RECYCLEBIN
这是生产库最常踩的坑:用普通应用用户连库,执行 PURGE RECYCLEBIN,结果 DBA 用户的 BIN$ 表还在占空间。
-
PURGE RECYCLEBIN只清当前会话用户的回收站(即USER_RECYCLEBIN) - 要清某用户全部回收站,该用
PURGE USER username;(需 DBA 权限) - 要清特定表但记不清
BIN$名,先查DBA_RECYCLEBIN拿准名字,再PURGE TABLE "BIN$abc123==$0";(引号不能省,含特殊字符)
回收站空间释放的关键不在“清动作”本身,而在于清之前是否确认了对象归属、容器上下文和锁状态,以及清之后是否意识到 Oracle 不会自动缩容数据文件。











