永久表空间存储持久对象(如表、索引),临时表空间仅用于sql执行时的中间结果;create table 指定 temp 表空间会报 ora-02195 错误;dba_tablespaces 的 contents 列是唯一可靠判断依据;tempfile 不归档、不可备份、重启清空内容。

永久表空间和临时表空间的用途根本不同
永久表空间(如 USERS、EXAMPLE)存的是你明确要保留的数据:表、索引、视图、存储过程这些对象一旦创建就一直存在,除非你手动删掉。临时表空间(如 TEMP)只在 SQL 执行过程中“借来用一下”——比如 ORDER BY 排序、GROUP BY 分组、哈希连接、物化视图刷新时内存不够了,Oracle 就往这儿写中间结果,语句一结束,内容就标记为空闲,不保留任何逻辑数据。
执行 CREATE TABLE 时指定 TEMP 表空间会直接报错
这是最常踩的坑:以为只要表空间存在就能用,结果执行 CREATE TABLE t1 (...) TABLESPACE TEMP 立刻失败。Oracle 会抛出 ORA-02195(attempt to create object in a temporary tablespace)或更隐蔽的 ORA-01652(unable to extend temp segment),本质是语法层拦截——临时表空间根本不接受段(segment)创建。它只允许 Oracle 内部使用临时段(temporary segment),用户无法显式分配。
dba_tablespaces 的 CONTENTS 列是唯一可靠判断依据
别靠名字猜,TEMP 不一定就是临时表空间,TEMP02 也可能是永久的。真正区分靠查询:
SELECT tablespace_name, contents, status FROM dba_tablespaces;
结果中:
-
CONTENTS = 'PERMANENT'→ 永久表空间(含SYSTEM、SYSAUX,但它们不能脱机) -
CONTENTS = 'TEMPORARY'→ 临时表空间(只支持AUTO段管理,不参与备份) -
CONTENTS = 'UNDO'→ 撤销表空间(专管回滚段)
临时表空间文件(TEMPFILE)和永久数据文件行为差异极大
临时文件(TEMPFILE)不记录到控制文件的归档日志流里,所以:
- 数据库重启后,
TEMPFILE内容被清空,但文件本身还在磁盘上(大小不变) - 你不能对
TEMPFILE执行BACKUP或RESTORE操作 - 不能设为
READ ONLY,也不能手工 shrink(收缩)——所谓“空间不释放”,其实是空闲块被重用,而非磁盘未回收
而永久数据文件(DATAFILE)每笔写入都受事务保护,可备份、可恢复、可 offline。











