前几天,客户的某套库中,出现该报警,同时临时表空间突然撑满,查阅了下MOS,也没找到很好的解释,于是回去看了concept,慢慢的理解这其中的原因。
1、临时段的产生
在以下的几种条件中, 可能会产生临时段
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
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/