ITPub博客

首页 > 数据库 > Oracle > ORA-01652: unable to extend temp segment by XX in tablespace XX

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

原创 Oracle 作者:gydba 时间:2015-09-06 16:22:40 0 删除 编辑
前几天,客户的某套库中,出现该报警,同时临时表空间突然撑满,查阅了下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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Linux调优-vmstat
请登录后发表评论 登录
全部评论

注册时间:2015-08-24

  • 博文量
    77
  • 访问量
    151998