不会。DROP TABLESPACE INCLUDING CONTENTS 仅清除数据字典元数据并标记数据文件为可删除,不删除操作系统中的.dbf文件;需加 AND DATAFILES(12c+)并满足OMF等条件才可能删物理文件。
Oracle 中 DROP TABLESPACE INCLUDING CONTENTS 真的会删物理文件吗?
不会。这个命令只从数据字典中移除表空间元数据,并标记数据文件为“可删除”,但操作系统层面的 .dbf 文件依然存在,得手动清理。
常见错误现象:执行完命令后查 dba_data_files 看不到记录,以为万事大吉;结果磁盘空间没释放,下次建同名表空间时报 ORA-01119: error in creating database file —— 因为旧文件还在。
- 必须先确认表空间里没有活动事务或未提交的会话(否则报
ORA-01548: active rollback segment) - 如果表空间含临时段、回滚段或默认临时表空间,得先切换或清空再删
-
INCLUDING CONTENTS删除段对象,但不删DATAFILE路径本身;AND DATAFILES才触发数据库尝试删 OS 文件(仅限 Oracle 12c+ 且需ALTER SYSTEM SET "_disable_file_copy"=FALSE配合)
删表空间前必须检查的三个地方
跳过检查直接删,大概率导致应用报错或恢复困难。
- 查依赖:
SELECT owner, table_name FROM dba_tables WHERE tablespace_name = 'YOUR_TS_NAME'—— 确认没业务表残留 - 查用户默认表空间:
SELECT username, default_tablespace FROM dba_users WHERE default_tablespace = 'YOUR_TS_NAME'—— 若有,先ALTER USER ... DEFAULT TABLESPACE ... - 查是否为默认临时表空间:
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'—— 是的话必须先换掉,否则删表空间会失败
Oracle 12c+ 安全删文件的完整命令链
想让 DROP TABLESPACE 真正删掉 OS 文件,不能只靠 INCLUDING CONTENTS,得加 AND DATAFILES 并满足前提条件。
- 确保数据库启用了 OMF(Oracle Managed Files)或数据文件路径在
DB_CREATE_FILE_DEST下,否则AND DATAFILES会被忽略 - 命令顺序必须是:
DROP TABLESPACE ts_name INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS -
CASCADE CONSTRAINTS很关键:否则外键引用该表空间里的表时会报ORA-02449 - 删完立刻验证:
!ls -lh /path/to/datafiles/ | grep your_ts—— 别只信数据字典
误删后怎么快速定位残留文件?
删完表空间但磁盘没释放,别急着 rm -rf,先找清楚哪些文件真属于它。
- 查历史数据文件路径:
SELECT file_name FROM dba_data_files AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR WHERE tablespace_name = 'YOUR_TS_NAME'(需开启闪回) - 没闪回?翻
alert.log,搜索creating datafile或adding datafile,通常能捞到原始路径 - 用
lsof -p $ORACLE_PID | grep deleted看有没有被进程占用却已 unlink 的文件(少见但可能) - 确认无误后再
rm,别删错归档日志或控制文件路径
最麻烦的不是删不掉,而是删了一半发现还有表在用 —— 所以删之前 SELECT * FROM v$session WHERE username IS NOT NULL AND rownum 快速扫一眼当前活跃用户更省事。










