oracle表空间分为永久、临时、撤销三类:永久表空间(如users)存储表、索引等持久对象;临时表空间(如temp)专用于排序、哈希连接等临时操作;撤销表空间(如undotbs1)负责事务回滚、闪回查询与一致性读,三者用途、生命周期及管理方式严格区分,不可混用。
永久表空间存数据,临时表空间做排序,撤销表空间管回滚——三者用途、生命周期和管理方式完全不同,不能混用。
怎么一眼识别表空间类型?看 dba_tablespaces 的 CONTENTS 列
执行 SELECT tablespace_name, contents, status FROM dba_tablespaces; 就能直接区分:
-
CONTENTS = 'PERMANENT':永久表空间(如USERS、EXAMPLE),用户对象(表、索引)都放这儿 -
CONTENTS = 'TEMPORARY':临时表空间(如TEMP),只用于ORDER BY、GROUP BY、哈希连接等中间结果 -
CONTENTS = 'UNDO':撤销表空间(如UNDOTBS1),专供事务回滚、闪回查询、一致性读
注意:SYSTEM 和 SYSAUX 虽然也是永久表空间,但它们是 Oracle 自带的系统表空间,不能脱机或删掉;普通用户建的永久表空间(比如 HR_DATA)才真正用于业务数据。
为什么不能把临时表空间当永久表空间用?
临时表空间里的数据不持久,数据库重启后自动清空,且不允许创建任何永久对象:
- 在
TEMP表空间上执行CREATE TABLE ... TABLESPACE TEMP会报错:ORA-01652: unable to extend temp segment或更直接的ORA-02195: attempt to create object in a temporary tablespace - 临时文件(
TEMPFILE)不参与备份恢复,也不能设置为只读 - 段空间管理强制为
AUTO,不支持SEGMENT SPACE MANAGEMENT MANUAL
临时表空间只接受排序、物化视图刷新、并行查询等“即用即丢”的操作,它的设计目标就是快进快出,不是存数据的地方。
撤销表空间为什么不能共享或复用?
每个 Oracle 实例必须且只能有一个当前激活的撤销表空间(由 undo_tablespace 参数指定),原因很硬:
- 撤销数据必须按事务时间顺序连续写入,跨表空间会导致事务链断裂,
ROLLBACK或闪回可能失败 -
UNDO表空间的数据文件必须启用AUTOEXTEND,否则事务高峰期容易触发ORA-30036: unable to extend segment - 切换撤销表空间需先
ALTER SYSTEM SET undo_tablespace = 'NEW_UNDO' SCOPE=BOTH,旧表空间要等所有活动事务结束才能脱机
常见误操作是把 UNDOTBS1 改成只读或尝试往里建表——这会直接导致新事务无法启动,数据库挂起。
创建时最容易填错的参数有哪些?
建表空间语句看着简单,但几个关键参数填错就会让表空间“半残”:
- 永久表空间漏写
EXTENT MANAGEMENT LOCAL:Oracle 12c+ 默认要求本地管理,不写可能降级为字典管理(已弃用),引发性能问题 - 临时表空间用了
DATAFILE而不是TEMPFILE:语法错误,报ORA-01565: error in identifying file - 撤销表空间没配
AUTOEXTEND ON:事务量稍大就爆ORA-30036,尤其 OLTP 环境下几乎必然发生 - 路径权限不对:DBA 执行
CREATE时,Oracle 进程必须对/u01/app/oracle/oradata/mydb/xxx.dbf所在目录有写权限,否则报ORA-01119: error in creating database file
真正麻烦的不是语法错,而是表空间建完能用、但运行几天后突然卡住——多半是 MAXSIZE 设太小,或者没开 AUTOEXTEND,这类问题往往要等业务高峰才暴露。











