程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle清理臨時表空間的實際操作

Oracle清理臨時表空間的實際操作

編輯:Oracle數據庫基礎

本文是對Oracle清理臨時表空間的相關應用的介紹。正常的來說,我們在完成Select語句、等一些經常使用TEMP的表空間排序與相關操作後,Oracle會自動的釋放掉在臨時段a的。以下就是相關內容的介紹。

但有些有侯我們則會遇到臨時段沒有被釋放,TEMP表空間幾乎滿的狀況,甚至是我們重啟了數據庫仍沒有解決問題。這個問題在論壇中也常被網友問到,下面我總結一下,給出幾種處理方法。

法一、重啟庫

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

法二、Metalink給出的一個方法

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

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

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

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

  1. SELECT username,  
  2. sid,  
  3. serial#,  
  4. sql_address,  
  5. Machine,  
  6. program,  
  7. tablespace,  
  8. segtype,  
  9. contents  
  10. FROM v$session se,  
  11. v$sort_usage su  
  12. WHERE se.saddr=su.session_addr  

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

  1. SQL>Alter system kill session 'sid,serial#';  

3、把TEMP表空間回縮一下

  1. SQL>Alter tablespace TEMP coalesce; 

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

1、 確定TEMP表空間的ts#

  1. SQL>select ts#, name from sys.ts$ ;  
  2. TS# NAME  
  3. SYSYEM  
  4. RBS  
  5. USERS  
  6. TEMP  
  7. TOOLS  
  8. INDX  
  9. DRSYS 

2、 執行清理操作

  1. SQL>alter session set events 'immediate trace name 
    DROP_SEGMENTS level 4' ; 

說明:

temp表空間的TS# 為 3*, So TS#+ 1= 4

Oracle清理的其它方法:

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

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

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)"

  1. FROM (SELECT TABLESPACE_NAME,  
  2. ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,  
  3. ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES  
  4. FROM SYS.DBA_FREE_SPACE  
  5. GROUP BY TABLESPACE_NAME) F,  
  6. (SELECT DD.TABLESPACE_NAME,  
  7. ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB  
  8. FROM SYS.DBA_DATA_FILES DD  
  9. GROUP BY DD.TABLESPACE_NAME) D  
  10. WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME  
  11. ORDER BY 4 DESC  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved