drop 表不释放磁盘空间,因其仅移入回收站(user_recyclebin),段仍占用数据文件空间;需执行 purge 操作(如 drop table ... purge 或 purge recyclebin)才能真正释放空间并使 df -h 显示增加。
delete 不释放空间,drop 默认也不释放磁盘空间——因为表进了回收站(user_recyclebin),必须显式 purge 或清空回收站才能真正腾出空间。
为什么 DROP 表后 df -h 看不到磁盘空间增加
Oracle 的 DROP TABLE 默认不物理删除,而是把表重命名后移入回收站(user_recyclebin)。表段(segment)依然占用数据文件空间,只是对用户不可见。
- 查回收站:
SELECT object_name, original_name, type FROM user_recyclebin; - 回收站里的对象仍计入
dba_segments和数据文件使用量 - 对应的数据文件(
dba_data_files)大小不变,OS 层磁盘空间自然不释放 - 只有执行
DROP TABLE ... PURGE或PURGE RECYCLEBIN才真正释放 segment 空间
彻底清理:PURGE 比 FLASHBACK 更快更干净
如果你确认不需要恢复那些被 DROP 的表,别只依赖 DROP TABLE t1,直接走 PURGE 路线:
- 单表立即清除:
DROP TABLE t1 PURGE; - 清空当前用户回收站:
PURGE RECYCLEBIN; - 清空所有用户回收站(需 DBA 权限):
PURGE DBA_RECYCLEBIN; - 注意:
PURGE不可逆,且不触发任何触发器或约束检查
执行后,再查 dba_segments 就看不到对应表段了,对应数据文件的 bytes_used 会下降,OS 层磁盘空间才会真实释放。
表空间级释放:COALESCE 不等于 shrink,慎用
即使 PURGE 完所有表,表空间内碎片可能仍存在。此时 ALTER TABLESPACE ts_name COALESCE; 只能合并相邻的空闲 extent,不能把分散的空闲块聚合成大块,更不会把空间还给操作系统。
-
COALESCE是表空间内部整理,适用于本地管理(LMT)表空间 - 它不减少数据文件大小,
df -h不会变化 - 真要缩容数据文件,得先
ALTER DATABASE DATAFILE 'xxx.dbf' RESIZE N M;,但前提是文件末尾无活动 segment —— 通常要先MOVE表/索引到其他表空间腾出尾部空间 - 日常运维中,
COALESCE效果有限,优先确保回收站已清空
误删后还能恢复?FLASHBACK TABLE 前必须开 row movement
如果 DROP 后还没 PURGE,想用 FLASHBACK TABLE ... TO BEFORE DROP 恢复,有隐含前提:
- 目标表必须没被 PURGE,且仍在
user_recyclebin中 - 执行前需先启用行移动:
ALTER TABLE t1 ENABLE ROW MOVEMENT;(否则报 ORA-08189) - 该操作允许 Oracle 在 flashback 过程中变更 rowid,但会与域索引(Domain Index)冲突
- 恢复后记得关掉:
ALTER TABLE t1 DISABLE ROW MOVEMENT;,避免后续 DML 异常
真正释放空间这件事,和能不能恢复是两回事——能恢复说明空间还在,但你不主动 PURGE,它就一直占着不动。











