一、Oracle临时表空间作用
在Oracle数据库进行排序、分组汇总、索引等动作时,会产生很多的临时数据,如有一张员工信息表,数据库中是按照记录建立的时间来保存的。如果用户查询是,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。通常情况下,Oracle会先将这些临时数据存放到内存的PGA(程序全局区)内。但是这个分区容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。临时表空间主要使用在以下几种情况:
1、order by or group by(disc sort占主要部分);
2、索引的创建和重创建;
3、distinct操作;
4、union & intersect & minus sort-merge joins;
5、Analyze操作;
6、有些异常也会引起TEMP暴涨。
二、Oracle临时表空间暴涨原因
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 ‘sid,serial#’
执行此语句后再对TEMP表空间resize空间大小就可以了。
注:此方法只是对TEMP表空间做临时性的缩小,以后还会继续增大。
Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。
查看目前的Temporary Tablespace
1、创建中转临时表空间
create temporary tablespace TEMP1 ‘/oradata/qct/temp02.DBF’ size 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/
修改Nagios的check_oracle脚本请参考:
http://skymax.blog.51cto.com/165901/103331/
相关推荐
Oracle临时表空间的清理步骤,解决数据库临时表空间满的问题。
Oracle 临时表空间使用注意 Oracle 临时表空间使用注意 Oracle 临时表空间使用注意
oracle创建一个表空间创建临时表空间创建用户表空间资源的权限
oracle查找定位占用临时表空间较大的SQL语句方法,包括:(1)造成临时表空间暴涨的SQL还在运行中(2)造成临时表空间暴涨的SQL已经运行过了。
oracle-临时表空间详细介绍oracle-临时表空间详细介绍oracle-临时表空间详细介绍oracle-临时表空间详细介绍
Oracle释放临时表空间脚本
很好的,经典.创建Oracle 临时表,可以有两种类型的临时表:会话级的临时表,事务级的临时表 。
oracle11gR2创建临时表空间组. 使用临时表空间组而非普通的临时表空间,有如下好处: 由于SQL查询可以并发使用几个临时表空间进行排序操作,因此SQL查询很少会出现排序空间超出,避免当临时表空间不足时所引起的磁盘...
Oracle临时表空间不足和批处理缓慢问题探讨.pdf
Oracle 临时表功能介绍: Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。
临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。 with子查询实际上也是用了临时表,...
Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp表空间会...
不让临时表空间影响ORACLE数据库性能
Oracle存储过程中使用临时表 会话级临时表 事务级临时表
该文档详细描述了oracle表空间已满后如何查询表空间占用情况,如何扩展表空间。
当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间 中。这就是临时表空间的来历。看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。其实大家这是误解这...
在oracle中,使用查询语句查看表空间使用情况
查询oracle表空间使用情况,表空间文件详情,创建或者变更表空间大小
ORACLE临时段表空间不足,修改表空间大小
oracle temp表空间不足解决方法