分类: Oracle
2008-04-16 13:32:50
来源:赛迪网 作者:Alice |
在实际的应用中,很多人经常会遇到“ORA-1652: unable to extend temp segment”临时表空间被资源中的多个会话共享的情况,并且quotas不能限制每个用户使用的临时表空间数量,当临时表空间被填充满时,任何尝试获得更多的临时表空间的用户将会得到“ORA-1652: unable to extend temp segment”错误。
Oracle数据库排序基础
Oracle会话首先在内存中进行排序,当Oracle需要存储数据到临时表或者为哈西排序建立哈希表时,并且也会首先在内存中进行操作,虽然这两个操作不需要排序操作,但是它们在Oracle中的处理方式是相同的。
如果操作使用内存超过了阈值,Oracle会将操作分为多个较小的操作以使每个可以在内存中操作。部分结果将会被写入磁盘的临时表空间,任何一个会话可以使用的内存数依赖于初始化参数的设置,如果workarea_size_policy为auto,则由pga_aggregate_target控制,否则由sort_area_size, hash_area_size,和bitmap_merge_area_size控制内存的使用。
当排序操作太大以至于不能在内存中执行时,Oracle将在临时表空间中分配空间以执行操作。临时段在临时表空间中—也称为“排序段”,sys拥有,而不是执行排序操作的用户。通常每个表空间中只有一个排序段,因为多个会话可以共享排序段,用户使用临时表空间不需要在其上有quota,事实上会被Oracle忽略。
临时表空间中只能包含临时段,因此临时段上的操作不会产生undo和redo,同时分配临时段给用户也不需要记录在dd或位图块上。因为临时表空间不会超过创建它的会话的生命周期。
一个SQL可以有多个排序操作,一个数据库会话同时可以有多个活动的SQL,当到磁盘上的排序结果不再需要时,其在排序段中的块会标记为不再使用并可以被分配给其他排序操作。
如果发生以下情况排序操作将会失败:排序段中没有不再使用的块;临时表空间中没有空间可以供排序段分配额外的分区。这在大多数情况下会导致语句发生以下错误:“ORA-1652: unable to extend temp segment.”并记录在实例的alert log中。
不过需要注意的是ORA-1652并不全部指示临时表空间问题,ALTER TABLE…MOVE也会发生该错误,如果目标表空间没有足够的空间容纳移动的表空间。
识别由于缺少临时表空间失败的SQL语句
虽然Oracle logs ORA-1652错误到警告日志中通知dba发生了空间问题,但是Oracle不会识别那条错误的语句。
可以使用Oracle诊断事件跟踪ORA-1652事件,该诊断事件的影响很小,仅在发生ORA-1652错误时才会写入信息。
ALTER SESSION SET EVENTS '1652 trace name errorstack';
在会话范围内设置;
ALTER SYSTEM SET EVENTS '1652 trace name errorstack';
永久性设置:
ALTER SYSTEM SET EVENT = '1652 trace name errorstack' SCOPE = SPFILE;
还可以在其他会话内使用“oradebug event”进行跟踪。 |