熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

ORACLE臨時表空間的清理

2013-11-13 22:24:11  來源: Oracle 

  ORACLE臨時表空間的清理

  查看使用率

  column TablespaceName format a heading Tablespace Name

  column TotalUsedBytes format heading File Sizes|(K)

  column TotalFreeBytes format heading Free Bytes|(K)

  column FreeRatio format heading Free|(%)

  column TotalExtensibleBytes format heading Extensible|Sizes (K)

  column TotalExtends format heading Ext

  compute sum label Total: of TotalFreeBytes TotalUsedBytes TotalExtensibleBytes on report

  break on report

  select bTablespaceName

  round(sum(bUsedByte) / ) TotalUsedBytes

  round(sum(aFreeByte) / ) TotalFreeBytes

  round(sum(bExtensibleByte) / ) TotalExtensibleBytes

  round(sum(aFreeByte + bExtensibleByte) * / sum(bUsedByte + bExtensibleByte) ) FreeRatio

  sum(aExtend) TotalExtends

  from (select sum(bytes) FreeByte

  count(*) Extend

  file_id FileID

  tablespace_name TablespaceName

  from dba_free_space

  group by file_id

  tablespace_name

  union all

  select sum(bytes_free) FreeByte

  count(*) Extend

  file_id FileID

  tablespace_name TablespaceName

  from v$temp_space_header

  group by file_id

  tablespace_name) a

  (select decode(autoextensible YES decode(sign(maxbytes bytes) maxbytes bytes ) ) ExtensibleByte

  bytes UsedByte

  file_id FileID

  tablespace_name TablespaceName

  from dba_data_files

  union all

  select decode(autoextensible YES decode(sign(maxbytes bytes) maxbytes bytes ) ) ExtensibleByte

  bytes UsedByte

  file_id FileID

  tablespace_name TablespaceName

  from dba_temp_files) b

  where bFileID = aFileID(+) and

  bTablespaceName= aTablespaceName(+)

  group by bTablespaceName;

  正常來說在完成Select語句create index等一些使用TEMP表空間的排序操作後Oracle是會自動釋放掉臨時段a的但有些有侯我們則會遇到臨時段沒有被釋放TEMP表空間幾乎滿的狀況甚至是我們重啟了數據庫仍沒有解決問題這個問題在論壇中也常被網友問到下面總結一下給出幾種處理方法

  法一重啟庫

  庫重啟時Smon進程會完成臨時段釋放TEMP表空間的清理操作不過很多的時侯我們的庫是不允許down的所以這種方法缺少了一點的應用機會不過這種方法還是很好用的

  法二Metalink給出的一個方法

  修改一下TEMP表空間的storage參數讓Smon進程觀注一下臨時段從而達到清理和TEMP表空間的目的

  SQL>alter tablespace temp increase ;

  SQL>alter tablespace temp increase ;

  法三我常用的一個方法具體內容如下

   使用如下語句a查看一下認誰在用臨時段

  SELECT username

  sid

  serial#

  sql_address

  machine

  program

  tablespace

  segtype

  contents

  FROM v$session se

  v$sort_usage su

  WHERE sesaddr=susession_addr

   那些正在使用臨時段的進程

  SQL>Alter system kill session sidserial#;

  把TEMP表空間回縮一下

  SQL>Alter tablespace TEMP coalesce;

  法四使用診斷事件的一種方法也是被我認為是殺手锏的一種方法

   確定TEMP表空間的ts#

  SQL>select ts# name from systs$ ;

  TS# NAME

  

   SYSYEM

   RBS

   USERS

  * TEMP

   TOOLS

   INDX

   DRSYS

   執行清理操作

  SQL>alter session set events immediate trace name DROP_SEGMENTS level ;

  說明

  temp表空間的TS# 為 * So TS#+ =

  其它

   出現如上問題的原因我認為可能是由於大的排序超出了TEMP表空間的空間允許范圍引起的也可能包含著其它的異常的因素

   觀注TEMP等這些空間的狀態是Dba日常職責之一我們可以通過ToadObject Browser等這些工具辦到也可以用如下的語句

  SELECT UPPER(FTABLESPACE_NAME) 表空間名

  DTOT_GROOTTE_MB 表空間大小(M)

  DTOT_GROOTTE_MB FTOTAL_BYTES 已使用空間(M)

  TO_CHAR(ROUND((DTOT_GROOTTE_MB FTOTAL_BYTES) / DTOT_GROOTTE_MB *

  )

  ) 使用比

  FTOTAL_BYTES 空閒空間(M)

  FMAX_BYTES 最大塊(M)

  FROM (SELECT TABLESPACE_NAME

  ROUND(SUM(BYTES) / ( * ) ) TOTAL_BYTES

  ROUND(MAX(BYTES) / ( * ) ) MAX_BYTES

  FROM SYSDBA_FREE_SPACE

  GROUP BY TABLESPACE_NAME) F

  (SELECT DDTABLESPACE_NAME

  ROUND(SUM(DDBYTES) / ( * ) ) TOT_GROOTTE_MB

  FROM SYSDBA_DATA_FILES DD

  GROUP BY DDTABLESPACE_NAME) D

  WHERE DTABLESPACE_NAME = FTABLESPACE_NAME

  ORDER BY DESC


From:http://tw.wingwit.com/Article/program/Oracle/201311/18994.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.