Temporary tablespace是oracle裏臨時表空間 臨時表空間主要用途是在數據庫進行排序運算 管理索引 訪問視圖等操作時提供臨時的運算空間 當運算完成之後系統會自動清理 當oracle裏需要用到sort的時候 PGA中sort_area_size大小不夠時 將會把數據放入臨時表空間裏進行排序 同時如果有異常情況的話 也會被放入臨時表空間 正常來說 在完成Select語句 create index等壹些使用TEMP表空間的排序操作後 Oracle是會自動釋放掉臨時段的 但有些有侯我們則會遇到臨時段沒有被釋放 TEMP表空間幾乎滿的狀況 甚至是我們重啟了數據庫仍沒有解決問題
排序是很耗資源的 Temp表空間滿了 關鍵是優化妳的語句 盡量使排序減少才是上策
Temp表空間滿時的處理方法
壹 修改參數(僅適用於 i及 i以下版本)
修改壹下TEMP表空間的storage參數 讓Smon進程觀註壹下臨時段 從而達到清理和TEMP表空間的目的
SQL>alter tablespace temp increase ;
SQL>alter tablespace temp increase ;
二 kill session
使用如下語句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
kill正在使用臨時段的進程
SQL>Alter system kill session sid serial# ;
把TEMP表空間回縮壹下
SQL>Alter tablespace TEMP coalesce;
註
這處方法只能針對字典管理表空間(Dictionary Managed Tablespace) 於本地管理表空間(LMT:Local Managed Tablespace) 不需要整理的 i以後只能創建本地管理的表空間
CREATE TABLESPACE TEST DATAFILE D:\TEST dbf SIZE M EXTENT MANAGEMENT DICTIONARY
CREATE TABLESPACE TEST DATAFILE D:\TEST dbf SIZE M EXTENT MANAGEMENT LOCAL;
三 重啟數據庫庫
庫重啟時 Smon進程會完成臨時段釋放 TEMP表空間的清理操作 不過很多的時侯我們的庫是不允許down的 所以這種方法缺少了壹點的應用機會 不過這種方法還是很好用的
四 使用診斷事件的壹種方法 也是最有效的壹種方法
確定TEMP表空間的ts#
SQL>select ts# name from sys ts$ ;
TS# NAME
SYSTEM
UNDOTBS
SYSAUX
TEMP
USERS
UNDOTBS
執行清理操作
SQL>alter session set events immediate trace name DROP_SEGMENTS level ;
說明
temp表空間的TS# 為 So TS#+ =
重建TEMP 表空間
Temporary tablespace是不能直接drop默認的臨時表空間的 不過我們可以通過以下方法來做
準備 查看目前的Temporary Tablespace
SQL> select name from v$tempfile;
NAME
———————————————————————
D:\ORACLE\ORADATA\TEST\TEMP DBF
SQL> select username temporary_tablespace from dba_users;
USERNAME TEMPORARY_TABLESPACE
MGMT_VIEW? TEMP
SYS? TEMP
SYSTEM TEMP
DBSNMP TEMP
SYSMAN TEMP
創建中轉臨時表空間
create temporary tablespace? TEMP TEMPFILE E:\ORACLE\ORADATA\ORCL\temp DBF SIZE M REUSE AUTOEXTEND ON NEXT? M MAXSIZE UNLIMITED;
改變缺省臨時表空間 為剛剛創建的新臨時表空間temp
alter database default? temporary tablespace? temp ;
刪除原來臨時表空間
drop tablespace temp including contents and datafiles;
重新創建臨時表空間
create temporary tablespace? TEMP TEMPFILE E:\ORACLE\ORADATA\ORCL\temp DBF SIZE M REUSE AUTOEXTEND ON NEXT? M MAXSIZE UNLIMITED;
重置缺省臨時表空間為新建的temp表空間
alter database default? temporary tablespace? temp;
刪除中轉用臨時表空間
drop tablespace temp including contents and datafiles;
如果有必要 那麽重新指定用戶表空間為重建的臨時表空間
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 * )
) 使用比
F TOTAL_BYTES 空閑空間(M)
F MAX_BYTES 最大塊(M)
FROM (SELECT TABLESPACE_NAME
ROUND(SUM(BYTES) / ( * ) ) TOTAL_BYTES
ROUND(MAX(BYTES) / ( * ) ) MAX_BYTES
FROM SYS DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
(SELECT DD TABLESPACE_NAME
ROUND(SUM(DD BYTES) / ( * ) ) TOT_GROOTTE_MB
FROM SYS DBA_DATA_FILES DD
GROUP BY DD TABLESPACE_NAME) D
WHERE D TABLESPACE_NAME = F TABLESPACE_NAME
lishixinzhi/Article/program/Oracle/201311/17017