精华内容
下载资源
问答
  • 临时表空间增长异常

    2019-10-02 03:32:28
    描述:客户环境某台数据库临时表空间异常增长(日期随机),观察下来可能是下列两个oracle自身的定时job引起, 时间:2014/01/14 凌晨1点左右 2014/01/08 凌晨4点左右 调查:我们发现客户环境有一条...
    描述:客户环境某台数据库临时表空间异常增长(日期随机),观察下来可能是下列两个oracle自身的定时job引起,
    时间:2014/01/14  凌晨1点左右
          2014/01/08  凌晨4点左右

    调查:我们发现客户环境有一条SQL语句的运行导致了临时表空间的异常增长。
    这条SQL语句的意思貌似是查询最近一个星期的DB time和DB CPU。
    麻烦跟开发确认一下这条语句的作用,是否可以进行优化。

    后续调查:
    查看dba_registry中CATPROC状态为invalid状态。同时导致在dba_objects中看到收集统计信息的dbms_stats也是invalid状态。
    手动运行@?/rdbms/admin/catproc.sql编译一下这个组件(execute DBMS_REGISTRY_SYS.VALIDATE_CATPROC;);
    接着重新编译一下dbms_stats这个包
    再重新编译上面三个WRH$的三个基表。



    原因:问题已经查明,那条SQL语句为SYS用户在晚上执行定时任务时所执行。
    之所以占用较大的临时表空间是因为该语句所涉及的三张表:
    WRH$_STAT_NAME
    WRM$_SNAPSHOT
    WRH$_SYS_TIME_MODEL
    统计信息不准,导致生成了较差的执行计划。
    手工收集统计信息以后,该语句可以很快完成,而且占用临时表空间也很小。
    这两个数据库的CATPROC组件(Oracle Database Packages and Types)之前处于INVALID状态,造成dbms_stats存储过程处于不可用状态,因此无法自动收集统计信息。目前dbms_stats已经处于可用状态。

    转载于:https://www.cnblogs.com/seven-dba/p/4354881.html

    展开全文
  • 问题描述: ... Oracle的临时表空间使用一直在缓慢增长,理论上临时表空间是重复使用的。但是从临时表空间使用率缓慢增长临时表空间没有释放过。 点击(此处)折叠或打开 ...

    问题描述:

    Oracle的临时表空间使用一直在缓慢增长,理论上临时表空间是重复使用的。但是从临时表空间使用率缓慢增长,临时表空间没有释放过。

    点击(此处)折叠或打开

    1. 日期 临时表空间 当前大小(G)
    2. --------------------------------------
    3. 2014/1/3 TEMP 85
    4. 2014/1/2 TEMP 74
    5. 2014/1/1 TEMP 64
    6. 2013/12/31 TEMP 45
    7. 2013/12/30 TEMP 13
    8. 2013/12/29 TEMP 13


    问题分析:

    业务也没有类似增长,所以应该不是业务导致的。从每天的增长看,是逐步累积的。经过检查发现占用临时表空间的语句访问了LOB对象。

    和开发沟通,和clob相关的代码如下:


    点击(此处)折叠或打开

    1. if p_benefit_str is not null then
    2.       v_length := length(p_benefit_str);
    3.       if v_length > 0 then
    4.         dbms_lob.open(p_benefit_clob,dbms_lob.lob_readwrite);
    5.         dbms_lob.writeappend(p_benefit_clob, v_length, p_benefit_str);
    6.         dbms_lob.close(p_benefit_clob);
    7.       end if;
    8.     end if;

    根据metalink文章,是lob在使用完成后需要free的。


    点击(此处)折叠或打开

    1. declare
    2.   clb clob;
    3.   ch varchar2(32767);
    4.   k number;
    5. begin
    6.   dbms_lob.createtemporary(clb,true,dbms_lob.call);
    7.     for i in 1..1500 loop
    8.       ch:=lpad('o',32767,'Y');
    9.       dbms_lob.writeappend(clb,length(ch),ch);
    10.     end loop;
    11.     k:=dbms_lob.getlength(clb);
    12.     dbms_lob.freetemporary(clb);
    13.     dbms_output.put_line('the clob length: '||k);
    14. end;
    15. /

    如果在java端调用后,可以在java端进行回收。


    点击(此处)折叠或打开

    1. 1.java.sql.NClob.free()
    2. 2.oracle.sql.NCLOB.freeTemprary()
    3. 3.(OracleCallableStatement) conn.prepareCall("begin DBMS_LOB.FREETEMPORARY ( ? ); end;");


    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25105315/viewspace-2132112/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/25105315/viewspace-2132112/

    展开全文
  • 近日在维护oracle数据库时发现临时表空间的数据文件temp.dbf从最初的几个G猛增到32G,达到上了磁盘文件的上限。搜索了一下,现将查询到的...当临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到...

    近日在维护oracle数据库时发现临时表空间的数据文件temp.dbf从最初的几个G猛增到32G,达到上了磁盘文件的上限。搜索了一下,现将查询到的临时表空间的相关资料以及处理方法简要归纳如下:

    1、临时表空间的作用:

    临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。

    当临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了。

    2、迅速增长的原因:

    一般原因是sql算法不正确,可能导致出现了迪卡尔积。

    另外一个原因是视图的创建问题。Oracle数据库中多张表联合查询时,极限的表单数量为4张,一般将以为3张!有时需要大于4张表联合查询时,怎么办呢?可以建立子视图:

    如view1(联合table0,table1,table2),view2(联合table0,table3,table4),view3(联合table0,table5,table6)

    然后将view1、view2、view3联合成view4。这样可以解决临时表空间迅速增长的问题!

    3、临时表空间异常增涨后的处理

    临时表空间异常暴涨后,极大的占用了磁盘空间,同时会影响普通查询的速度,以下方法可以达到清理临时表空间数据文件temp.dbf的大小

    方法一、在系统不繁忙的时候,执行命令缩减临时表空间数据文件的尺寸

    alter database tempfile '/u01/oradata/site/temp01.dbf' resize

    10240M;

    方法二、

    a、创建中转临时表空间

    create temporary tablespace temp_tmp tempfile

    '/u01/oradata/site/temp_tmp.dbf' size 10240m;

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

    alter database default temporary tablespace temp_tmp;

    c、删除原有的临时表空间以及数据文件

    drop tablespace temp including contents and datafiles;

    d、重新创建临时表空间

    create temporary tablespace temp tempfile

    '/u01/oradata/site/temp01.dbf' size 10240m;

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

    alter database default temporary tablespace temp;

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

    drop tablespace temp_tmp including contents and datafiles;

    4、临时表空间使用注意:

    a、临时表空间是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据),每个用户都可以有一个临时表空间

    b、对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理

    c、分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库。对于小型产品不需要单独制定临时表空间,使用默认临时表空间

    注:如果临时表空间异常增涨很快,则要考虑是否应用的sql语句产生了笛卡儿积,可以通过stactpack

    进行分析查出问题所在,从而保证数据库的正常运行

    展开全文
  • Oracle临时表空间

    千次阅读 2013-02-22 16:20:13
    oracle的临时表空间 Oracle临时表空间为何暴涨?  昨天在做测试的时候发现一个非常奇怪的问题:在程序的查询模块中做查询的时候,开始速度很快,但是过了一段时间以后速度就变慢,最后干脆就报错,不工作...

    oracle的临时表空间


    Oracle临时表空间为何暴涨?

            昨天在做测试的时候发现一个非常奇怪的问题:在程序的查询模块中做查询的时候,开始速度很快,但是过了一段时间以后速度就变慢,最后干脆就报错,不工作了。在排错的过程中,发现Oracle临时表空间暴涨,达到了几十个GB,在Oracle中对Session进行跟踪,发现磁盘空间还在不停的消耗,几乎是每隔5s,临时表空间就会增长500MB左右,最后报错的原因应该是因为没有磁盘空间可以分配造成的。这是一件十分恐怖的事情。

            我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。像上文提到的恐怖现象经过分析可能是以下几个方面的原因造成的。
            1. 没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
            2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
           3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。
           针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。

           总结:
           1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。
           2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的软件中。
           3.仔细规划表索引。
           如果有那位高人遇到过类似的问题,请给予您的建议。

    1、临时表空间的作用:

    临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。

    当临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了。

    2、迅速增长的原因:

    一般原因是sql算法不正确,可能导致出现了迪卡尔积。

    另外一个原因是视图的创建问题(本人遇到的正是该问题!)。Oracle数据库中多张表联合查询时,极限的表单数量为4张,一般将以为3张!有时需要大于4张表联合查询时,怎么办呢?可以建立子视图:

    如view0(联合table0,table1,table2),view1(联合table0,table3,table4),view2(联合table0,table5,table6)

    然后将view0、view1、view2联合成view。

    这样可以解决临时表空间迅速增长的问题!

    以上所述,如有不正确的地方,欢迎大家指正!

     

    临时表空间使用注意:
    1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)
    每个用户都有一个临时表空间
    2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理

    3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,数据库仓库
    对于小型产品不需要单独制定临时表空间,使用默认临时表空间

    注:如果临时表空间异常增涨很快,则要考虑是否应用的sql语句产生了笛卡儿积,可以通过stactpack 进行分析查出问题所在,从而保证数据库的正常运行

    Oracle临时表空间过大的解决办法

    Temporary tablespace是oracle里临时表空间,临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段的。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。

    排序是很耗资源的,Temp表空间满了,关键是优化你的语句,尽量使排序减少才是上策。

     

    Temp表空间满时的处理方法:

      一、修改参数(仅适用于8i及8i以下版本)

      修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

    SQL>alter tablespace temp increase 1;
      SQL>alter tablespace temp increase 0;

    alter tablespace temp default storage(pctincrease 1);
    alter tablespace temp default storage(pctincrease 0);

     

      二:kill session
      1、 使用如下语句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;

     

      三、重启数据库库

      库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。

     

      四、使用诊断事件的一种方法,也是最有效的一种方法
      1、 确定TEMP表空间的ts#
      
    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


    重建TEMP 表空间:
     Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法来做。

     

    查看目前的Temporary Tablespace


    SQL> select name from v$tempfile;

    NAME
    ———————————————————————
    D:/ORACLE/ORADATA/TEST/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 'E:/ORACLE/ORADATA/ORCL/temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT  1M MAXSIZE UNLIMITED;  

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

    alter database default  temporary tablespace  temp1;

    3.删除原来临时表空间

    drop tablespace temp including contents and datafiles;

    4.重新创建临时表空间

    create temporary tablespace  TEMP TEMPFILE 'E:/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;

    7.如果有必要,那么重新指定用户表空间为重建的临时表空间

    alter user arbor temporary tablespace  temp; 

     

    查看表空间语句,不过查不出Temp表空间:

      SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
      D.TOT_GROOTTE_MB "表空间大小
    (M)",
      D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间
    (M)",
      
    TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),
      '990.99') "使用比
    ",
      F.TOTAL_BYTES "空闲空间
    (M)",
      F.MAX_BYTES "最大块
    (M)"
      
    FROM (SELECT TABLESPACE_NAME,
      
    ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
      
    ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
      
    FROM SYS.DBA_FREE_SPACE
      
    GROUP BY TABLESPACE_NAME) F,
      
    (SELECT DD.TABLESPACE_NAME,
      
    ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
      
    FROM SYS.DBA_DATA_FILES DD
      
    GROUP BY DD.TABLESPACE_NAME) D
      
    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
      ORDER BY 4 DESC

     

     

    展开全文
  • 笔者接到一个做开发上线的兄弟电话,说正在试运行的系统存储过程突然变慢,而且偶然发现数据库的Temp表空间突然增加到20多G。这位兄弟不知道是不是与存储过程突然变慢有关,而且应该如何处理。   1、从Temporary...
  • Oracle临时表空间说明

    千次阅读 2016-09-28 05:42:36
    一、临时表空间作用... 2 二、临时表空间释放... 2 法一、重启库... 2 法二、Metalink给出的一个方法... 3 法三、我常用的一个方法... 3 法四、使用诊断事件的一种方法... 3 法五、 重建TEMP 表空间... 3 三...
  • 临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了。2、迅速增长的原因:一般原因是sql算法不正确,可能导致出现了迪卡尔积。另外一个原因是...
  • 临时表空间作用

    千次阅读 2010-09-03 17:00:00
    临时表空间
  • Oracle 临时表空间

    2013-11-12 10:56:21
    一、临时表空间主要使用在以下几种情况: 1、order by or group by (disc sort占主要部分); 2、索引的创建和重创建; 3、distinct操作; 4、union & intersect & minus sort-merge joins; 5、Analyze 操作; ...
  • 临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了。 2、迅速增长的原因: 一般原因是sql算法不正确,可能导致出现了迪卡尔积。 另外...
  • (17) 管好临时表空间

    千次阅读 2013-12-14 18:44:56
    临时表空间的管理是个不大不小的事,如果你不理它,你会发现它好像忽然间就上几十G了,而且还在增长, 弄得磁盘空间很紧张。而且你扩容后,还是会发现使用率经常是100%.所以有必要说一下这种表空间的一些事情。  ...
  • 当你监控temporary tablespace 的空闲空间,发现空闲空间并没有随着sort的结束而增加,甚至当前数据库没有...1652(在temp表空间上),这个错误表明没有足够的空间,但是当用户的查询失败后,smon并没有去清理临时段。
  • Oracle:由临时表空间

    2008-10-02 13:46:00
    临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了。 2、迅速增长的原因: 一般原因是sql算法不正确,可能导致出现了迪卡尔积。 另外一个原因...
  • 如何缩减Oracle9i环境下临时表空间的尺寸 在sun操作系统下安装Oracle9i后,系统默认安装的临时表空间的尺寸最大为32G,造成系统物理备份时所需的空间十分庞大。经实际操作,总结如下希望有所帮助。 具体方法: 1...
  • 临时表空间

    2011-05-04 21:24:00
    <br />http://www.itpub.net/386227,1.html<br />经常看到有人说看到temporary tablespace空间不释放等等的问题,整理一篇metalink上的相关文章,入门级的,还算浅显吧。基本上就是翻译了。 有疑问的欢迎...
  • 临时表空间作用 Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的...
  • 当排序在内存中无法完成时就会使用...当临时表空间出现异常不可用时,该如何进行恢复呢? 常用的有两种方法,一种方法我称其为“重新启动法”,另外一种方法权且称做“新增替换法”吧。实验分解之。 1.“重
  • Temp 临时表空间

    千次阅读 2013-01-09 16:26:38
    当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表...
  • Oracle Temp临时表空间及其故障处理

    千次阅读 2017-06-12 14:54:43
    Oracle Temp临时表空间及其故障处理 Oracle 11g中Temp临时...
  • 今天提交请求后,提示ORA-01652: 无法通过 128 (在表空间 ...扩展临时表空间来解决。在网上找了些资料,重新学习下临时表空间的知识点,记录在此以免以后忘记。 临时表空间相关知识点总结(转载) 临时表空间的作用...
  • 数据库temp临时表空间增大,一般在数据安装时设置临时表空间大小,默认的情况下都是设置为自动增长。这样会引起一个问题:在数据库使用中temp表空间会自动扩展的越来越大,造成磁盘空间使用不足。 引起临时表空间...
  • oracle临时表空间过大的原因&&处理

    千次阅读 2011-06-02 13:50:00
    如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的。 1. 没有为临时表...
  • 消除临时表空间暴涨的方法

    千次阅读 2013-07-23 15:57:28
     经常有人问temp表空间暴涨的问题,以及如何回收临时表空间,由于版本的不同,方法显然也多种多样,但这些方法显示是治标不治本的办法,只有深刻理解temp表空间快速增加的原因,才能从根本上解决temp ts的问题。...
  • oracle的临时表空间

    2013-09-04 11:38:33
    http://www.itpub.net/386227,1.html经常看到有人说看到temporary tablespace空间不释放等等的问题,整理一篇metalink上的相关文章,入门级的,还算浅显吧。基本上就是翻译了。有疑问的欢迎讨论。参考metalink:...
  • 近日在维护ora10g数据库时发现临时表空间的数据文件temp.dbf从最初的512m猛增到5G,严重占用了磁盘空间。经过多次努力,总于解决问题,现将查询到的临时表空间的相关...当临时表空间不足时,表现为运算速度异常的...
  • 在数据库的日常学习中,发现公司生产数据库的默认临时表空间temp使用情况达到了30G,使用率达到了100%; 待调整为32G后,使用率还是为100%,导致磁盘空间使用紧张。根据临时表空间的主要是对临时数据进行排序和...
  • Oracle Temp 临时表空间

    千次阅读 2011-09-28 15:10:13
    当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,100
精华内容 6,840
关键字:

临时表空间增长异常