ORA-01652: unable to extend temp segment by XX in tablespace XX

前几天,客户的某套库中,出现该报警,同时临时表空间突然撑满,查阅了下MOS,也没找到很好的解释,于是回去看了concept,慢慢的理解这其中的原因。


1、临时段的产生
在以下的几种条件中, 可能会产生临时段
  •  创建索引的时候,Oracle进程会在创建索引之前需要将索引值进行排序。而排序完成之后,先会在索引所在的表空间 中 创建临时段,然后会将段的类型变为索引段。
  • 在select语句中有order by 或者group by 
  • 在select语句中有distinct关键字
  • 在union、intersect或者minus操作
  • 使用sort_Merge的连接方式时
  
2、临时表空间的释放和使用
Oracle的临时表空间是使用SORT EXTENT POOL来管理临时段的使用和释放。使用临时表空间的临时段之前,进程获得SORT EXT POOL LATCh 之后将会从 SORT EXTENT POOL 中分配新的空间,如果临时表空间不足,则会报ORA-01652错误。
ORA-12801: error signaled in parallel query server P017
ORA-01652: unable to extend temp segment by 640 in tablespace XY_TEMP

当排序操作完成后,进程需要再次获得SORT EXTENT POOL LATCH,并将使用过的EXTENT 标记为FREE 状态,然后释放SORT EXTENT POOL LATCH。
在RAC 系统中,虽然所有的实例可以使用相同的临时表空间,但每个实例会独立维护自己的SORT EXTENT POOL。 当本实例无法在自己的SORT EXTENT POOL中分配到EXTENT时,且无法从临时表空间中分配到空间,那么可以从其它节点SORT EXTENT POOL 中的分配到FREE状态的表空间中。这个操作对前台经常是透明的,但是节点的警告日志中会留下ORA-01652错误。
   基于性能上的考虑,新的 临时段算法在分配临时段时采用"只分配不释放"的原则。即临时段被分配后,即使排序操作完成,也只会在SORT EXTENT POOL中将其标记为FREE状态,并不会从临时表空间释放,由于临时段使用之后不释放,所以经常可以看到临时表空间的使用率高为100%。临时表空间中的临时段只有在 数据库重启或所在的临时表空间被删除后才会释放。

常用的视图:
1. select  * from gv$sort_segment
2. select sum(bytes), owner from gv$temp_extent_map group by owner;
3. select inst_id, blocks_cached, blocks_used, extents_cached, extents_used from GV$TEMP_EXTENT_POOL;


扩展:
熊爷的一次案例分析《一次临时表空间大量占用问题的处理》
地址:http://www.laoxiong.net/temporary_tablespace_excessive_usage_case.html


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1792517/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30430420/viewspace-1792517/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值