oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及解决方案
1、order by or group by (disc sort占主要部分);2、索引的创建和重创建;3、distinct操作;4、union & intersect & minus sort-merge joins;5、Analyze操作;6、有些异常也会引起TEMP的暴涨。临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的:1.没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的。2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。总结:1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的中。3.仔细规划表索引。如果临时表空间是temporary的,空间不会释放,只是在sort结束后被标记为free的,如果是permanent的,由SMON负责在sort结束后释放,都不用去手工释放的。查看有哪些用户和导致TEMP增长的两个重要视图:v$ sort_usage和v$sort_segment。通过查询相关的资料,发现解决方案有如下几种:一、重建临时表空间tempTemporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。查看目前的Temporary TablespaceSQL> select name from v$tempfile;
NAME
———————————————————————
D:\ORACLE\ORADATA\ORCL\TEMP01.DBF
SQL> select username,temporary_tablespace from dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------------ ------------------------------
MGMT_VIEW TEMP
SYS TEMP
SYSTEM TEMP
DBSNMP TEMP
SYSMAN TEMP
1.创建中转临时表空间create temporary tablespace TEMP1 TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M
MAXSIZE UNLIMITED;
2.改变缺省临时表空间为刚刚创建的新临时表空间temp1alter database default temporary tablespace temp1;
3.删除原来临时表空间drop tablespace temp including contents and datafiles;
4.重新创建临时表空间create temporary tablespace TEMP TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE
UNLIMITED;
5.重置缺省临时表空间为新建的temp表空间alter database default temporary tablespace temp;
6.删除中转用临时表空间drop tablespace temp1 including contents and datafiles;以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。下面是查询在sort排序区使用的执行耗时的SQL:Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_text
from v$sort_usage su,v$parameter p,v$session se,v$sql s
where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid;或是:Select su.username,su.Extents,tablespace,segtype,sql_text
from v$sort_usage su,v$sql s
Where su.SQL_ID = s.SQL_ID;注:如果原临时表空间无用户使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系统可以看看文件的时间戳。我们可以删除该表空间:如果原临时表空间还有用户在使用,你是删除不了这个表空间的!在一次生产环境的临时表空间切换中,原临时表空间始终有用户在上面,即使我关闭了前台程序,也还是有用户,新的临时表空间已经没有用户在使用了。我估计用户进程已经死在原临时表空间了,后来只有重新启动数据库才能把原来旧的临时表空间给删除。二、修改参数(这个方案紧适用于8i及8i以下的版本)修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;三、Kill session1、使用如下语句a查看一下认谁在用临时段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_usage su WHERE se.saddr = su.session_addr
2、kill正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';
3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;注:这处方法只能针对字典表空间(Dictionary Managed Tablespace)。于本地管理表空间(LMT:Local Managed Tablespace),不需要整理的。9i以后只能创建本地管理的表空间。CREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT DICTIONARY
CREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL;四、使用诊断事件,也是相对有效的一种方法1、查询事件代码SQL>select ts#, name from sys.ts$ ;
TS# NAME
---------- ------------------------------
0 SYSTEM
1 UNDOTBS1
2 SYSAUX
3 TEMP
4 USERS
5 UNDOTBS2
2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4';说明:temp表空间的TS#为3, So TS#+ 1= 4。oracle临时表空间过大的原因2009-05-12 11:22
Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的。1.没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。总结:1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的软件中。3.仔细规划表索引。如果临时表空间是temporary的,空间不会释放,只是在sort结束后被标记为free的,如果是permanent的,由SMON负责在sort结束后释放,都不用去手工释放的。查看有哪些用户和SQL导致TEMP增长的两个重要视图:v$sort_usage和v$sort_segment对于非LMT管理方式的TEMP表空间,最简单的方法是Metalink给出的一个方法:修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。SQL>alter tablespace temp default storage(pctincrease 1);
SQL>alter tablespace temp default storage(pctincrease 0);而对于LMT管理方式的TEMP表空间,需要重新建立一个新的临时表空间,将所有用户的默认临时表空间指定到新的表空间上,然后offline旧的临时表空间,并drop掉。具体步骤如下:首先查询用户的缺省临时表空间:[oracle@jumper oracle]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 11:11:43 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> select username,temporary_tablespace from dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYS TEMP2
SYSTEM TEMP2
OUTLN TEMP2
EYGLE TEMP2
CSMIG TEMP2
TEST TEMP2
REPADMIN TEMP2
......
13 rows selected.
SQL> select name from v$tempfile;
NAME
---------------------------------------------------------------------
/opt/oracle/oradata/conner/temp02.dbf
/opt/oracle/oradata/conner/temp03.dbf重建新的临时表空间并进行切换:SQL> create temporary tablespace temp tempfile '/opt/oracle/oradata/conner/temp1.dbf' size 10M;
Tablespace created.
SQL> alter tablespace temp add tempfile '/opt/oracle/oradata/conner/temp2.dbf' size 20M;
Tablespace altered.
SQL> alter database default temporary tablespace temp;
Database altered.
SQL> select username,temporary_tablespace from dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYS TEMP
SYSTEM TEMP
OUTLN TEMP
EYGLE TEMP
CSMIG TEMP
TEST TEMP
REPADMIN TEMP
.......
13 rows selected.如果原临时表空间无用户使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系统可以看看文件的时间戳。我们可以删除该表空间:(如果原临时表空间还有用户在用,你是删除不了这个表空间的!在一次生产环境的临时表空间切换中,原临时表空间始终有用户在上面,即使我关闭了前台程序,也还是有用户,新的临时表空间已经没有用户在使用了。我估计用户进程已经死在原临时表空间了。后来只有重新启动数据库才能把原来旧的临时表空间给删除。)SQL> drop tablespace temp2;
Tablespace dropped.
SQL>
SQL> select name from v$tempfile;
NAME
---------------------------------------------------------------
/opt/oracle/oradata/conner/temp1.dbf
/opt/oracle/oradata/conner/temp2.dbf
SQL> select file_name,tablespace_name,bytes/1024/1024 MB,autoextensible
2 from dba_temp_files
3 /
FILE_NAME TABLESPACE_NAME MB AUTOEXTENSIBLE
-------------------------------------- -------------------- ---------- --------------
/opt/oracle/oradata/conner/temp2.dbf TEMP 20 NO
/opt/oracle/oradata/conner/temp1.dbf TEMP 10 NO
drop tablespace temp including contents and datafiles; --将表空间的内容和数据文件一起删除。下面是查询在sort排序区使用的执行耗时的SQL:Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_text
from v$sort_usage su,v$parameter p,v$session se,v$sql s
where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr
order by se.username,se.sid或是:Select su.username,su.Extents,tablespace,segtype,sql_text
from v$sort_usage su,v$sql s
Where su.SQL_ID = s.SQL_ID
oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及解决方案相关推荐
- oracle占用内存 100,System表空间占用率100%,管理Oracle系统审计
C:\Users\user>sqlplus sys/********@lin_solgle as sysdba SQL*Plus: Release 11.2.0.1.0 Production o ...
- [ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%
产品现象 : 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到. 这种问题百思不得其解.谷歌/百度 所遇到的解决方案都是嵌 ...
- oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及临时解决方案...
数据库temp临时表空间增大,一般在数据安装时设置临时表空间大小,默认的情况下都是设置为自动增长.这样会引起一个问题:在数据库使用中temp表空间会自动扩展的越来越大,造成磁盘空间使用不足. 引起临时 ...
- oracle查询cpu占用率高,解决oracle进程CPU占用过高问题
解决问题的过程: 1)查看服务器CPU使用情况 输入top 会发现排在前面的都是oracle的进程,而且CPU占用率都是50以上. $top top - 16:28:41 up 4 days, 22: ...
- java资源使用效率较高,Java 进程资源使用率较高问题定位
在实际开发过程中,有些 Java 程序在本地或者在服务器上都可以运行的较正常,但是运行较长一段时间后,可能会出现资源占用率较高的情况,例如 CPU 或 内存占用率较高等情况,以至于发生内存溢出,进程假 ...
- linux主机sys使用率忽高忽低,cpu使用率忽高忽低的原因和解决方法
小编最近经常听说有的 人电脑cpu使用率老是忽高忽低,也不知道怎么回事虽然没怎么影响使用但是这无疑是一个潜在的隐患等到这个隐患爆发了对电脑的伤害可想而知,今天小编就来和大家说说cpu使用率忽高忽低的原 ...
- oracle数据库swap占用率高,Oracle数据库所在服务器swap严重
今天Nagios监控发现一台Oracle数据库服务器swap严重,导致部分Nagios监控项超时报警 查看该服务器,swap空间设置为32G,已使用19G,使用率非常高,并且,vmstat显示si严重 ...
- 一 如何检查oracle的归档日志及空间占用率,清除归档日志、Oracle归档日志使用情况查询、查看oracle数据库一周产生的归档日志
一 如何解决"归档日志已满问题" 问题描述:所用数据库为 Oracle 10g ,模式为归档模式,oracle 系统默认的归档空间为2G,由于日志过多,空间写满,数据库的redo文 ...
- oracle查询cpu占用率高,ORACLE杀掉cpu占用率高的session
SPID一一system process id,表示该server process在OS层面的Porcess ID PID一一Oracle process id,可以理解Oracle给自己的进程的一个 ...
- oracle数据库swap占用率高,物理内存空余很多,swap被持续占用的问题
本帖最后由 wyanghu 于 2012-8-18 10:21 编辑 这套生产环境跑在vmware esx虚拟机上,现在遇到的问题是:操作系统内存空余很大,但swap被持续占用,直到swap被占完,估 ...
最新文章
- android11有哪种手机,支持安卓11系统的机型有哪些
- oracle expdp 多线程,Oracle expdp 过滤和并行
- 乞丐版HTML5播放器
- QT的QTextStream类的使用
- Mysql找不到mysql.sock怎么办?
- easy bootstrap模板
- 不加载执行js_前端性能优化:preload 预加载页面资源
- 从云服务器上拷贝文件,从云服务器上拷贝文件
- 【华为敏捷/DevOps实践】4. 如何从Excel做项目管理的方式中走出来
- leetcode之字符串中的第一个唯一字符
- CCF 201412-4 最优灌溉
- 基础 网络架构 网络硬件名词 网络通信协议
- Linux关于DHCP详细的总结
- 学习C语言必须掌握的10个经典的C语言小程序
- 借书表设计 mysql_请设计一套图书馆借书管理系统的数据库表结构
- oracle导出导入同义词,oracle同义词语句备份
- Qt连接MySql驱动加载失败问题解决方法
- 2019年北航、南大、东南、上科大及本校计算机系保研
- ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-01:BootLoader+Application的开发模式
- tomcat宕机自动重启和每日定时启动tomcat