臨時表空間不足問題
今晚開發臨時拉我去定位一個數據庫問題,是臨時表空間不足的問題,主要是他們的sql存在clob大欄位排序把臨時表空間佔滿了且不釋放。
這種問題解決的最好辦法就是優化SQL,能把臨時表空間耗盡的sql明顯是存在很大的問題的。但目前臨時表空間不足已經影響到其他應用,所以恢復臨時表空間是當務之急。
治標不治本的辦法是增大臨時表空間:
alter tablespace temp add tempfile '/data01/oracle/oradata/temp02.dbf' size 10G autoextend on next 200M;
但很快臨時表空間又佔滿了。
恢復的辦法最好是重啟資料庫,讓臨時表空間釋放。殺死正在執行的會話是不會釋放臨時表空間的。要查到具體在使用臨時表空間的會話,可以通過檢視v$sort_usage查出會話id,然後alter system kill session
之後接合臨時表空間碎片Alter tablespace TEMP coalesce;
或者用下面的方法清理表空間:
SQL>select ts#, name from sys.ts$ ;
SQL>alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1' ;
查看錶空間的使用情況:
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)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC