临时表空间组不能显式创建,只能通过指定tablespace group隐式生成;首次将临时表空间分配给某组名时自动创建,移除该组所有成员后自动删除,组名不可与任何表空间重名。
临时表空间组不能显式创建,只能通过指定 tablespace group 隐式生成
oracle 11g 不提供 create tablespace group 这类独立语句。组的存在完全依赖于你是否在创建或修改临时表空间时用了 tablespace group group_name 子句。只要该 group_name 当前不存在,第一次使用就会自动建组。
常见错误是试图先“创建组”,再往里加表空间——这会失败,因为语法不支持。正确做法是直接在 CREATE TEMPORARY TABLESPACE 或 ALTER TABLESPACE 中带上组名:
-
CREATE TEMPORARY TABLESPACE temp4 TEMPFILE '/u01/oradata/db/temp4.dbf' SIZE 100M TABLESPACE GROUP grp_sort;→ 若grp_sort不存在,此时自动创建 -
ALTER TABLESPACE temp2 TABLESPACE GROUP grp_sort;→ 把已有表空间加入组(前提是组已存在) - 组名和任何表空间名不能重名,否则报错
ORA-10918: tablespace group name cannot be same as tablespace name
用 dba_tablespace_groups 查看组成员,别信 dba_tablespaces 的 CONTENTS 列
dba_tablespaces 里查不到组信息,它只列单个表空间;真正反映组—成员关系的是 dba_tablespace_groups 视图。执行 SELECT * FROM dba_tablespace_groups; 才能看到每个组包含哪些临时表空间。
容易被忽略的点:
- 一个临时表空间只能属于一个组(即使执行多次
ALTER TABLESPACE ... TABLESPACE GROUP,也只会归属最新指定的那个组) - 如果把组内最后一个表空间移出(比如设为空字符串
''),整个组就消失了,dba_tablespace_groups中不再显示该组 - 组名区分大小写,但默认大写;查询时注意匹配大小写,否则可能查不到
分配用户或设为数据库默认时,直接用组名代替单个表空间名
给用户指定临时表空间,或设置数据库级默认临时表空间时,TEMPORARY TABLESPACE 后面可以直接填组名,无需额外声明“这是个组”:
-
ALTER USER scott TEMPORARY TABLESPACE grp_sort;→ 用户后续所有会话将从grp_sort中轮询分配临时表空间 -
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE grp_sort;→ 新建用户若未显式指定临时表空间,就继承这个组 - 这种分配方式对并行查询特别有用:一个并行操作的多个 server process 可能各自拿到组内不同临时表空间,避免争用单个 tempfile
注意:如果组里只剩一个临时表空间,那它就退化为普通单表空间行为,起不到负载分散作用。
收缩临时文件前,确认没有活跃排序会话在用该文件
Oracle 11g 支持 ALTER TABLESPACE ... SHRINK TEMPFILE,但这个操作不是无风险的。如果目标 tempfile 正被某个 session 用于排序(比如正在跑一个大 ORDER BY 或 GROUP BY),命令会报 ORA-12953: The request exceeds the maximum allowed database size 或直接 hang 住。
安全做法是先检查实际使用情况:
- 运行
SELECT * FROM v$sort_usage;看当前哪些 session 在用哪些 tempfile - 结合
v$tempfile和v$temp_space_header查看每个文件的已用/空闲比例 - 最好选在低峰期操作,或提前通知业务方暂停大查询
临时表空间组本身不影响收缩操作——你只能对单个 TEMPFILE 或其所属的单个临时表空间收缩,组只是逻辑容器,不参与物理空间管理。











