临时表空间必须建在共享存储上,否则rac会崩溃;所有实例需同时访问同一物理文件,禁用本地路径,须用asm或集群文件系统,并显式指定extent management local。

临时表空间必须建在共享存储上,否则RAC会崩溃
Oracle RAC中,所有实例必须能同时访问同一个临时表空间的物理文件。如果把TEMP或自定义临时表空间建在本地磁盘(比如/u01/oradata/db/temp01.dbf),某个实例启动后写入、其他实例无法打开该文件,直接报ORA-01157,甚至导致节点挂起。
常见错误现象:执行SELECT * FROM v$tempfile看到路径是本地路径;df -h发现不同节点的/u01挂载点内容不一致;数据库告警日志反复出现ORA-01157: cannot identify/lock datafile。
- 必须使用ASM路径(如
'+DATADG')或集群文件系统(如OCFS2、NFSv4 with pNFS)——不能用普通ext4本地路径 - 建表空间时显式指定
EXTENT MANAGEMENT LOCAL,这是强制要求,11g+默认就是,但显式写更安全 - 不要用
CREATE TEMPORARY TABLESPACE temp ... tempfile '/tmp/temp01.dbf' ...这种语句,哪怕只是测试也不行 - RAC中查
dba_temp_files,FILE_NAME列必须全节点一致,且每个节点都能通过asmcmd ls +DATADG/.../temp01.dbf看到该文件
用TABLESPACE GROUP分散并发压力,但别误以为能“负载均衡”
单个临时表空间在高并发排序场景下容易触发ORA-1652——不是磁盘真满了,而是多个会话争抢同一tempfile的extent分配锁。表空间组通过哈希绑定会话到不同成员,把压力摊到多个物理文件上。
但要注意:组内每个临时表空间仍需独立建在共享存储上;且Oracle只在会话初始化时做一次哈希绑定,后续整个会话生命周期都固定用那个成员,不会动态切换。
- 创建组无需
CREATE TABLESPACE GROUP命令,首次用TABLESPACE GROUP grp_temp子句建临时表空间即自动创建 - 添加新成员:用
ALTER TABLESPACE temp02 TABLESPACE GROUP grp_temp,不是ADD也不是INSERT - 组名不能和已有表空间同名,也不能加引号(
'grp_temp'非法) -
V$TEMPSEG_USAGE里看TABLESPACE_NAME列分布是否均匀;如果90%会话集中在temp01,说明组没生效,检查是否所有成员都是LOCAL管理、uniform size一致、物理路径不在同一ASM diskgroup(避免I/O瓶颈转移)
RAC中向TEMP添加tempfile必须跨节点验证路径和权限
执行ALTER TABLESPACE TEMP ADD TEMPFILE '+DATADG' SIZE 32G前,如果没确认所有节点都可写,可能只在一个节点成功,其他节点报错或静默失败。
关键检查点不是“语法对不对”,而是“grid用户在所有节点是否真能操作该磁盘组”。
- 先查磁盘组空间:
SELECT name, free_mb FROM v$asm_diskgroup WHERE name = 'DATADG',确保free_mb > 32768(32GB) - 在每个RAC节点用
grid用户执行:asmcmd lsdg DATADG,输出中State必须为MOUNTED,Usable_file_mb大于0 - 路径必须用ASM别名(
'+DATADG'),禁止用'+DATADG/ORCL/TEMPFILE/temp02.dbf'这种带具体文件名的写法——Oracle会自动命名 - 不要加
AUTOEXTEND ON:RAC中autoextend可能因节点间协调延迟导致空间分配冲突,推荐AUTOEXTEND OFF+ 定期监控v$sort_segment.used_blocks
PDB环境下临时表空间必须显式指定,CDB默认TEMP不继承
在多租户架构中,PDB不能用CDB的TEMP表空间。即使CDB的DEFAULT TEMPORARY TABLESPACE设为TEMP,PDB连接后SELECT * FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'仍返回空,实际用的是CDB根容器的默认值——但这个行为不可靠,且12.2+已明确要求PDB必须有自己的临时表空间。
错误做法:ALTER PLUGGABLE DATABASE pdb1 SAVE STATE后以为万事大吉;实际某次重启后PDB无法登录,报ORA-01565或ORA-65045。
- 进PDB后执行:
CREATE TEMPORARY TABLESPACE pdb1_temp TEMPFILE '+DATADG' SIZE 2G - 再设为默认:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE pdb1_temp - 删旧表空间前确认无活动会话:
SELECT * FROM v$sort_usage WHERE tablespace = 'TEMP'(在CDB root查) -
dba_temp_files.SHARED字段值很重要:LOCAL_ON_ALL表示该临时表空间在所有实例本地创建(仅Flex Cluster Leaf节点适用),SHARED才是RAC标准共享模式
真正麻烦的不是命令敲错,而是误以为“建完就完事”。RAC里临时表空间的路径一致性、组内成员的物理隔离、PDB与CDB的归属关系,任何一个环节在节点间不收敛,都会在高并发或重启后暴露——而且往往表现为会话卡死、统计信息收集失败这类“看起来不像空间问题”的症状。











