不会自动删除操作系统层面的数据文件。DROP TABLESPACE INCLUDING CONTENTS 仅清除数据字典元数据和段对象,数据文件仍保留在磁盘上;需手动删除或使用 INCLUDING CONTENTS AND DATAFILES(限OMF环境)。
DROP TABLESPACE INCLUDING CONTENTS 会删掉数据文件吗?
不会自动删除操作系统层面的数据文件。执行 drop tablespace including contents 只是从数据字典中移除表空间元数据、清空段对象(表、索引等),但对应的数据文件(如 /u01/oradata/orcl/users01.dbf)仍保留在磁盘上,处于“已废弃但未释放”的状态。
这是最常被误以为“已彻底清理”的地方——DBA 看到表空间查不到了,就以为万事大吉,结果磁盘空间没释放,下次建同名表空间还可能报错 ORA-01119: error in creating database file(因文件已存在)。
实操建议:
- 执行前先查清数据文件路径:
SELECT file_name FROM dba_data_files WHERE tablespace_name = 'YOUR_TS_NAME';
- 确认无误后,再手动用操作系统命令(如
rm或 Windows 的del)删除对应文件 - 若表空间含临时文件(
TEMPFILE),需单独用DROP TEMPFILE,它不随INCLUDING CONTENTS一并处理
为什么加了 CASCADE CONSTRAINTS 还是报 ORA-02429?
因为 DROP TABLESPACE INCLUDING CONTENTS 默认不级联删除引用该表空间中对象的外键约束,即使你加了 CASCADE CONSTRAINTS,这个子句只对 DROP TABLE 有效,对 DROP TABLESPACE 是无效语法——Oracle 会直接报错 ORA-02429: cannot drop index used for enforcement of unique/primary key 或类似约束依赖错误。
真正起作用的是 INCLUDING CONTENTS AND DATAFILES 后面的隐式行为:它要求所有对象必须可安全删除,即不能有跨表空间的依赖(比如主键索引在别的表空间、LOB segment 分离存储等)。
排查要点:
- 检查是否有索引在别的表空间:
SELECT owner, index_name, tablespace_name FROM dba_indexes WHERE table_owner = 'XXX' AND tablespace_name != 'YOUR_TS_NAME';
- 检查 LOB 字段是否指定了独立的
TABLESPACE:SELECT owner, table_name, column_name, tablespace_name FROM dba_lobs WHERE tablespace_name = 'YOUR_TS_NAME';
- 如有,需先
MOVE或REBUILD到目标表空间内,或先删依赖对象
INCLUDING CONTENTS AND DATAFILES 和单独删文件有什么区别?
INCLUDING CONTENTS AND DATAFILES 是 Oracle 12c 引入的增强语法,它会在删除表空间的同时,调用底层 API 尝试删除数据文件——但前提是数据库必须以 OMF(Oracle Managed Files)模式运行,且文件由 Oracle 自动命名(如 O1_MF_USERS_XXXXX.DBX)。否则仍会报错 ORA-01516: nonexistent log file, datafile or tempfile,因为 Oracle 拒绝操作非 OMF 文件。
所以实际效果取决于配置:
- OMF 开启(
db_create_file_dest已设)→AND DATAFILES能删物理文件 - 手工指定路径创建的文件 → 必须手动删,
AND DATAFILES无效,甚至导致语句失败 - 临时表空间不支持
AND DATAFILES,只能用DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES对普通表空间
删完表空间后 DBA_TABLESPACES 还能看到记录?
正常情况下不会。如果查询 DBA_TABLESPACES 仍显示该表空间,说明删除未成功,或者你查的是另一个 PDB(在多租户环境中,表空间是 PDB 级别对象)。更常见的情况是:你连错了实例或容器,比如当前连接的是 CDB$ROOT,而表空间建在某个 PDB 内。
验证方式:
- 确认当前容器:
SHOW CON_NAME;
- 切换到对应 PDB 再查:
ALTER SESSION SET CONTAINER = your_pdb;
- 或统一用带容器信息的视图:
SELECT con_id, tablespace_name FROM cdb_tablespaces WHERE tablespace_name = 'YOUR_TS_NAME';
另外,回收站(RECYCLEBIN)里不会有表空间对象,它只存删掉的表、索引等,表空间本身不可恢复——这点和普通 DROP TABLE 不同,得记牢。











