ITPub博客

首页 > 数据库 > Oracle > 临时表空间使用率过高的解决办法

临时表空间使用率过高的解决办法

原创 Oracle 作者:zhcunique 时间:2023-01-13 09:28:25 0 删除 编辑

1.执行下述SQL,占用TEMP表空间较大的session信息一目了然

SELECT V.INST_ID,

      V.SID,

      V.SERIAL#,

      V.USERNAME,

      V.STATUS,

      V.ACTION,

      V.MACHINE,

      V.MODULE,

      V.OSUSER,

      V.TERMINAL,

      V.PROGRAM,

      V.SQL_ID,

      SU.TABLESPACE,

      (SU.BLOCKS *

      TO_NUMBER((SELECT RTRIM(VALUE)

                   FROM V$PARAMETER P

                  WHERE P.NAME = 'db_block_size'))) / 1024 / 1024 AS SIZE_M,

      (SELECT ROUND(SUM(BYTES) / (1024 * 1024), 3) FROM V$TEMPFILE) TEMP_TS_SIZE_M,

      ROUND((SU.BLOCKS *

            TO_NUMBER((SELECT RTRIM(VALUE)

                         FROM V$PARAMETER P

                        WHERE P.NAME = 'db_block_size'))) * 100 /

            (SELECT SUM(BYTES)

               FROM V$TEMPFILE),

            3) C_USED_PERCENT,

      SU.SEGTYPE,

      (SELECT A.SQL_TEXT

         FROM GV$SQLAREA A

        WHERE A.SQL_ID = NVL(V.SQL_ID,SU.SQL_ID)

          AND A.INST_ID = V.INST_ID

          AND ROWNUM = 1) SQL_TEXT,

      SU.SEGFILE#,

      SU.SEGBLK#,

      SU.EXTENTS,

      SU.BLOCKS,

      SU.SEGRFNO#

 FROM GV$SORT_USAGE SU, --GV$TEMPSEG_USAGE

      GV$SESSION    V

WHERE SU.SESSION_ADDR = V.SADDR

  AND SU.INST_ID = V.INST_ID

ORDER BY SU.INST_ID,  SU.BLOCKS DESC

GV$SORT_USAGE与GV$TEMPSEG_USAGE可以互相替代。

视图GV$SORT_USAGE中的SEGTYPE列的不同的值所代表的含义如下所示:

SORT:SQL排序使用的临时段,包括ORDER BY、GROUP BY、DISTINCT、窗口函数、合并查询(UNION、INTERSECT、MINUS)、索引的创建(CREATE)和重建(REBUILD)、ANALYZE分析表等产生的排序。

DATA:临时表(GLOBAL TEMPORARY TABLE)存储数据使用的段。

INDEX:临时表上建的索引使用的段。

HASH:HASH算法,如HASH连接所使用的临时段。

LOB_DATA和LOB_INDEX:临时LOB使用的临时段。

2.分析占用率过高的会话,确保会话异常或SQL异常后,可以清理该会话:

ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;

3.会话清理后如表空间不释放,可采用下述办法释放空间:

SELECT TS#, NAME FROM V$TABLESPACE WHERE NAME='TEMP';

ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME DROP_SEGMENTS LEVEL 4';

其中,LEVEL后的值为TS#+1。在以上例子中,TEMP表空间的TS#为3,所以TS#+1=4。

4.其他简单粗暴的解决办法:

1)重启数据库。

2)重建表空间:

/**查看当前的数据库默认表空间**/

    SQL>select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

/**确认当前的临时表空间为TEMP**/

/**查看目前临时表空间的大小**/

    SQL>select file_name,tablespace_name,bytes/1024/1024 "MB",autoextensible from dba_temp_files;

/**创建另一个临时表空间**/

    SQL>create temporary tablespace TEMP2 TEMPFILE 'D:\oradata\temp02.dbf' SIZE 10M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

/**改变缺省临时表空间为刚刚创建的新临时表空间temp2**/

    SQL>alter database  default temporary tablespace temp2; 

/**删除原来临时表空间**/

    SQL>drop tablespace temp including contents and datafiles;

/**重新创建临时表空间temp **/

    SQL>create temporary tablespace TEMP TEMPFILE 'D:\oradata\temp01.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED; 

/**重置缺省临时表空间为新建的temp表空间**/

    SQL>alter database default temporary tablespace temp; 

/**删除中转用临时表空间 **/

    SQL>drop tablespace temp2 including contents and datafiles; 

/**重新指定用户表空间为重建的临时表空间 **/

    SQL>alter user yhm temporary tablespace temp;


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

请登录后发表评论 登录
全部评论
先后就职于银行、券商等金融机构科技部门,从事数据库管理、自动化运维管理与系统运维相关工作,拥有Oracle 11g OCM/OCP证书,通过CFA二级考试。

注册时间:2021-02-04

  • 博文量
    73
  • 访问量
    499675