RAC中临时表空间“突然爆满”主因是多实例争抢同一tempfile文件头锁,导致enq: TS – contention等待;根本解法是为每实例配专属临时表空间并逐实例验证status与默认值。
为什么RAC里临时表空间会“突然爆满”
不是因为sql写得差,而是多个实例在抢同一个tempfile的文件头锁。rac中临时段本身是实例本地的,但若所有实例共用一个temp表空间,且该表空间只含1个tempfile(哪怕它在asm共享盘上),所有排序操作都会串行排队等待该文件头的latch,表现为持续的enq: ts – contention等待事件——此时dba_temp_files可能显示“存在”,但实际只有1个实例能真正写入。
- 检查每个实例是否真能访问自己的
tempfile:在每个节点单独执行SELECT tablespace_name, status, enabled FROM dba_temp_files,status必须为ONLINE且enabled为READ WRITE - 别信
gv$视图汇总结果:默认临时表空间设置是实例级的,SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'必须逐实例查,gv$database_properties不反映本实例实际生效值 - 表空间组(
TABLESPACE GROUP)只是逻辑标签:组里只有一个表空间,等于没分片;组里多个表空间但没绑定到对应实例,默认仍走老路径
如何给每个RAC实例配专属临时表空间
核心动作不是“加文件”,而是“建新空间+绑实例+验证路径”。必须确保每个tempfile的ASM路径带实例标识,例如+DATA/racdb_inst1/temp01.dbf,而不是笼统的+DATA/temp01.dbf——OMF自动路径生成默认不区分实例,极易导致争抢。
- 禁用OMF:
ALTER SYSTEM SET db_create_file_dest='' SCOPE=BOTH,避免Oracle自动生成无实例标识的路径 - 为实例1建专属空间:
CREATE TEMPORARY TABLESPACE temp_inst1 TEMPFILE '+DATA/racdb_inst1/temp01.dbf' SIZE 2G - 绑定本实例默认值:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_inst1(此命令只作用于当前实例,不会广播) - 验证是否生效:
SELECT file_name, status, enabled FROM dba_temp_files WHERE tablespace_name = 'TEMP_INST1',确认status为ONLINE且路径确属本实例ASM挂载点
临时表空间使用率100%但无法释放怎么办
不是磁盘真满了,而是有活跃会话长期持有临时段未释放。重启实例最彻底(SMON会清理),但生产环境不允许时,必须定位并终止源头会话。
- 查谁在占临时段:
SELECT se.username, se.sid, se.serial#, su.tablespace, su.segtype, su.contents FROM v$session se, v$sort_usage su WHERE se.saddr = su.session_addr - 注意
v$sort_usage只反映当前活跃排序,不包括已提交但未释放的临时段;若查询为空但使用率仍100%,可能是PGA不足触发大量磁盘排序,需调大pga_aggregate_target - 杀会话后执行收缩:
ALTER TABLESPACE temp_inst1 SHRINK SPACE(仅对启用了AUTOEXTEND OFF或已回收空间的文件有效) - 别依赖
coalesce:临时表空间不支持ALTER TABLESPACE ... COALESCE,该命令对TEMP无效
扩容或重建临时表空间的实操边界
加文件、扩大小、设autoextend,都是治标;重建才是治本,但必须避开两个坑:一是中转表空间未设为默认就删原空间,二是重建后没重置实例默认值,导致部分实例继续往旧空间写。
- 重建流程关键顺序:先建中转空间→
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE切过去→确认所有用户temporary_tablespace字段已更新→再DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES - 查用户默认临时表空间:
SELECT username, temporary_tablespace FROM dba_users,重建后这部分不会自动更新,需手动ALTER USER ... TEMPORARY TABLESPACE - ASM路径权限易被忽略:即使路径带实例名,也要确认该diskgroup在对应节点已
MOUNT且CHMOD可写,否则enabled状态会是DISABLED
dba_temp_files.status和database_properties——这两项不一致,后面所有操作都白搭。











