zoukankan      html  css  js  c++  java
  • Oracle中暂时表空间的清理

    作者:iamlaosong

    Oracle暂时表空间主要用来做查询和存放一些缓冲区数据。

    暂时表空间消耗的主要原因是须要对查询的中间结果进行排序。暂时表空间的主要作用:

    索引create或rebuild
    Order by 或 group by
    Distinct 操作
    Union 或 intersect 或 minus
    Sort-merge joins
    analyze


    重新启动数据库能够释放暂时表空间。假设不能重新启动实例,而一直保持问题sql语句的运行,temp表空间会一直增长。即使重建了暂时表空间,过一段时间后,暂时表空间的使用率就达到99%。然后,表空间就開始增长,直到耗尽硬盘空间。

    例如以下图所看到的暂时表空间,刚建立时是8G,如今已到32G:



    为了防止暂时表空间无限制的添加。我採用隔一段时间就重建暂时表空间的方法,为了方便,我保留两组语句,轮流运行就可以。假定如今暂时表空间名称是temp,新建一个tempa表空间。删除temp表空间,方法例如以下:

    create   temporary   tablespace   TEMPA   TEMPFILE   '/opt/app/oracle/oradata/orcl/tempa01.dbf '   SIZE   8192M   REUSE   AUTOEXTEND   ON   NEXT  1024K   MAXSIZE   UNLIMITED;   --创建中转暂时表空间 
    alter   database   default   temporary   tablespace   tempa;      --改变缺省暂时表空间

    drop   tablespace   temp   including   contents   and   datafiles;     --删除原来暂时表空间 

    新建的暂时表空间例如以下图所看到的:


    过一段时间,当暂时表空间增长到一定的程度,再新建一个temp表空间,删除tempa表空间,即:

    create   temporary   tablespace   TEMP   TEMPFILE   '/opt/app/oracle/oradata/orcl/temp01.dbf '   SIZE   8192M   REUSE   AUTOEXTEND   ON   NEXT  1024K   MAXSIZE   UNLIMITED;   --创建中转暂时表空间 
    alter   database   default   temporary   tablespace   temp;    --改变缺省暂时表空间
    drop   tablespace   tempa   including   contents   and   datafiles;  --删除原来暂时表空间 

    这样就能够保证暂时表空间不至于过大。防止过多的占用有限的硬盘空间。

    =====================================================

    用以下语句可查看当前暂时表空间使用空间大小与正在占用暂时表空间的sql语句:

    select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
      from v$sort_usage sort, v$session sess, v$sql sql
     where sort.SESSION_ADDR = sess.SADDR
       and sql.ADDRESS = sess.SQL_ADDRESS
     order by blocks desc;

    以下语句查询暂时表空间的空暇程度:

    select 'the ' || name || ' temp tablespaces ' || tablespace_name ||
           ' idle ' ||
           round(100 - (s.tot_used_blocks / s.total_blocks) * 100, 3) ||
           '% at ' || to_char(sysdate, 'yyyymmddhh24miss')
      from (select d.tablespace_name tablespace_name,
                   nvl(sum(used_blocks), 0) tot_used_blocks,
                   sum(blocks) total_blocks
              from v$sort_segment v, dba_temp_files d
             where d.tablespace_name = v.tablespace_name(+)
             group by d.tablespace_name) s,
           v$database;


  • 相关阅读:
    PosegreSQL基础回顾(第 5 章 数据定义)
    PosegreSQL基础回顾(第 4 章 SQL语法)
    大数据学习2(伪分布式搭建)
    大数据学习2(MapReduce)
    大数据学习1(HDFS)
    Linux find用法
    shell循环
    查询一次数据库给多个变量赋值
    linux cut用法
    linux权限
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7123079.html
Copyright © 2011-2022 走看看