`

Oracle临时表空间使用过高及解决方案

 
阅读更多

 

一、Oracle临时表空间作用

 

     在Oracle数据库进行排序、分组汇总、索引等动作时,会产生很多的临时数据,如有一张员工信息表,数据库中是按照记录建立的时间来保存的。如果用户查询是,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。通常情况下,Oracle会先将这些临时数据存放到内存的PGA(程序全局区)内。但是这个分区容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。临时表空间主要使用在以下几种情况:

 

  1order by or group bydisc sort占主要部分);

  2、索引的创建和重创建;

  3distinct操作;

  4union & intersect & minus sort-merge joins

  5Analyze操作;

  6、有些异常也会引起TEMP暴涨。

 

二、Oracle临时表空间暴涨原因

Ø没有为临时表空间设置上限,而是允许无限增长。但是如果如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置多大需要仔细的测试。
Ø查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个笛卡尔积,这个笛卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
Ø对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间中,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。
 
三、解决TEMP临时表空间过大
ü直接缩小TMEP表空间大小
   alter database tempfile 临时文件路径’resize 1024M;
   此语句会直接修改TEMP表空间的大小,但可能会执行不成功,因为当TEMP使用率为100%或者当前有
   会话占用时,TEMP表空间是无法缩小的。使用数据库管理员用户查询当前会话:

   select  se.username,se.sid,se.serial#,se.sql_address,se.machine,se.program,su.tablespace,su.segtype,su.contents

   from v$session se, v$sort_usagesu where se.saddr = su.session_addr

   利用此sql语句查询当前会话,然后kill当前会话:

   alter system kill session sidserial#

   执行此语句后再对TEMP表空间resize空间大小就可以了。

   注:此方法只是对TEMP表空间做临时性的缩小,以后还会继续增大。

ü重建TEMP临时表空间

   Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。

   查看目前的Temporary Tablespace



 

  1、创建中转临时表空间

   create temporary tablespace TEMP1 /oradata/qct/temp02.DBFsize 1000M REUSE AUTOEXTEND ON

   NEXT 1M MAXSIZE UNLIMITED

  2、改变缺省临时表空间为刚刚创建的新临时表空间temp1

  3、删除原来临时表空间

   drop tablespace temp including contents and datafiles;

  4、重新创建临时表空间

   create temporary tablespace TEMP TEMPFILE’/oradata/qct/temp01.DBF’ SIZE 1000M REUSE

   AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

  5、重置缺省临时表空间为新建的temp表空间

  alter database default temporary tablespace temp;

  6、删除中转用临时表空间

  drop tablespace temp1 including contents and datafiles;

  以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正治本的方法是找出

  数据库中消耗资源较大的sql语句,然后对其进行优化处理。

 

四、监控临时表空间使用情况

Oracle用户查看哪些用户和SQL导致TEMP增长有两个重要视图:v$sort_usagev$sort_segment

通过下面语句可查询在sort排序区使用的执行耗时的用户SQL

select * from (select sess.sid,segtype,blocks,sql_text from v$sort_usagesu,v$sessionsess,v$sqlsql where su.session_addr = sess.saddr and sql.address = sess.sql_address order by blocks desc) where rownum <= 5


 或者select su.username,su.extents,tablespace,segtype,sql_text from v$sort_usage,v$sql s where su.sql_id = s.sql_id

 

注:如果原临时表空间无用户使用( select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,round((free_blocks/total_blocks), 4) * 100 || '%' as freeprc from v$sort_segment

 

通过下面的SQL可以查看哪些用户在使用临时段

select se.username,se.sid,se.serial#,se.sql_address,se.machine,se.program,su.tablespace,su.segtype,su.contents from v$session se, v$sort_usagesu where se.saddr = su.session_addr;

 

通过下面的SQL可以监控临时表空间使用率

select round((f.BYTES_FREE + f.BYTES_USED) / 1024 / 1024, 2) "total MB",round(((f.BYTES_FREE + f.BYTES_USED) - nvl(p.BYTES_USED, 0)) / 1024 / 1024,2) "Free MB",round(nvl(p.BYTES_USED, 0) / 1024 / 1024, 2) "Used MB",round(nvl(p.BYTES_USED, 0) / 1024 / 1024, 2) /round((f.BYTES_FREE + f.BYTES_USED) / 1024 / 1024, 2) * 100 || '%' "UPRC",d.file_name "fileName" from sys.v_$temp_space_headerf,Dba_Temp_Filesd,SYS.v_$temp_Extent_Pool p where f.TABLESPACE_NAME(+) = d.tablespace_name and f.FILE_ID(+) = d.file_id and p.FILE_ID(+) = d.file_id and d.tablespace_name = 'TEMP';

 

或者

select A.tablespace_name, total "total MB", used "Used MB", (used / total * 100 || '%') uprc from (select tablespace_name, sum(bytes) / 1024 / 1024 total from dba_temp_files group by tablespace_name) A left outer join (select tablespace_name,sum(BYTES_USED) / 1024 / 1024 used from v_$temp_Extent_Pool group by tablespace_name) B on b.tablespace_name = a.tablespace_name where A.tablespace_name = 'TEMP‘;

 

注:

可通过修改Nagios(开源IT基础设施监控系统)的check_oracle脚本来实时监控Oracle临时表空间并自动告警运维人员。

Nagios监控系统安装请参考:

http://www.ibm.com/developerworks/cn/lunix/1309_luojun_nagios/

修改Nagioscheck_oracle脚本请参考:

http://skymax.blog.51cto.com/165901/103331/


 

 

 

 

 

 

  • 大小: 915 Bytes
  • 大小: 2.1 KB
  • 大小: 38.6 KB
  • 大小: 3.4 KB
  • 大小: 1.9 KB
  • 大小: 74.8 KB
  • 大小: 1.6 KB
  • 大小: 1008 Bytes
分享到:
评论

相关推荐

    Oracle临时表空间满的解决步骤

    解决 Oracle 临时表空间满的问题需要通过查看当前数据库的默认临时表空间、查看当前临时表空间的大小、创建新的临时表空间、将新建的临时表空间设置为数据库的默认临时表空间、删除原来的临时表空间、创建新的临时表...

    Oracle临时表空间不足和批处理缓慢问题探讨.pdf

    2. 解决临时表空间不足问题的方法:通过编写记录使用临时表空间 SQL 语句的脚本,抓取最消耗临时表空间的语句,并对其进行优化。 3. AWR 报告的作用:AWR 报告可以显示占用临时表空间最高的 SQL 语句,但可能不准确...

    Oracle 临时表空间使用注意

    Oracle 临时表空间是Oracle...总之,理解并正确使用Oracle临时表空间是确保数据库高效运行的关键。通过对临时表空间的合理配置和管理,可以有效地提升数据库的响应速度,降低系统资源消耗,从而优化整体的数据库性能。

    学习oracle创建一个表空间创建临时表空间创建用户表空间资源的权限

    在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...

    Oracle释放临时表空间脚本

    合理的管理和优化临时表空间不仅可以提高系统的性能,还可以帮助解决空间不足等问题。本文将详细介绍如何通过SQL脚本进行临时表空间的查询、创建、修改以及删除操作。 #### 一、查询临时表空间信息 首先,我们来...

    Oracle 临时表用法

    为了解决这个问题,可以通过使用Oracle临时表来提高处理效率。本文将详细介绍Oracle临时表的创建方法、使用场景以及优缺点,帮助读者更好地理解和运用这一特性。 #### 二、Oracle临时表概述 Oracle临时表是一种...

    不让临时表空间影响ORACLE数据库性能

    - 文件"不要让临时表空间影响数据库性能 - Oracle - 1.mht"可能包含对临时表空间性能问题的初步分析和解决建议。 - 文件"不要让临时表空间影响数据库性能 - Oracle - 2.mht"可能详细讨论了临时表空间对数据库性能...

    oracle查找定位占用临时表空间较大的SQL语句方法

    oracle查找定位占用临时表空间较大的SQL语句方法,包括:(1)造成临时表空间暴涨的SQL还在运行中(2)造成临时表空间暴涨的SQL已经运行过了。

    ORACLE中临时表

    总结来说,Oracle的临时表机制提供了处理会话特定数据的解决方案,尽管存在一些限制,但通过自定义的设计和扩展,可以克服这些限制,实现更强大的功能。在使用临时表时,应考虑其生命周期、数据隔离性和性能影响,...

    oracle-临时表空间

    ### Oracle 临时表空间详解 #### 一、Oracle表空间概览 在Oracle数据库系统中,数据被组织成多个逻辑单元,这些单元被称为表空间。每个表空间由一个或多个物理磁盘文件(称为数据文件)组成,并且是数据库中的最高...

    Oracle存储过程中使用临时表

    本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...

    ORACLE SYSTEM表空间已满解决方案.docx

    ### ORACLE SYSTEM表空间已满解决方案 #### 一、SYSTEM表空间的作用 SYSTEM表空间是Oracle数据库中的一个关键组成部分,在数据库创建时会自动创建。它包含了许多重要的数据库元数据和控制信息,对于数据库的正常...

    Oracle 临时表之临时表的应用问题

     临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。  with子查询实际上也是用了临时表,...

    如何解决Oracle8i数据库临时表空间满的问题.pdf

    4. Oracle临时表空间满的问题:当临时表空间的磁盘空间被全部占用后,可能会出现错误消息,例如“ORA-1652: unable to extend temp segment by %s in tablespace %s”。这会导致用户无法完成如排序、并行查询等操作...

    oracle 查询表空间使用情况

    查询oracle表空间使用情况,表空间文件详情,创建或者变更表空间大小

    不要让临时表空间影响数据库性能

    如果不设定,默认情况下,Oracle会使用SYSTEM表空间创建临时段,这可能导致系统表空间的碎片化,影响读取效率,并占用宝贵的系统资源。为了避免这种情况,应当在创建用户时通过`default temporary tablespace`语句...

    oracle临时表用法

    Oracle 临时表用法 Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储数据,用于实现一些特定的应用场景。下面是 Oracle 临时表的详细知识点: 创建临时表 创建临时表的语法为: ``` CREATE GLOBAL ...

    oracle11g创建临时表空间组

    下面将详细介绍如何在Oracle 11g R2中创建临时表空间组,并解释使用该功能的优势。 #### 临时表空间组的优点 1. **避免排序空间超出:** SQL查询在执行过程中可能需要大量的临时空间来完成排序操作。如果使用单个...

    ORACLE修改表空间大小

    当Oracle数据库执行涉及排序、连接等操作时,会使用临时表空间来存储临时数据。如果这些操作所需的空间超过了临时表空间的可用空间,就会引发ORA-01652错误。 #### 二、ORA-01652 错误分析 ##### 1. 错误现象 当...

    oracle temp表空间不足解决方法

    Oracle数据库系统中,Temp表空间是用于存储临时段的地方,主要在执行排序、连接和创建索引等操作时使用。当遇到"Oracle temp表空间不足"的问题时,这通常意味着数据库运行过程中产生的临时数据超过了现有Temp表空间...

Global site tag (gtag.js) - Google Analytics