1. 程式人生 > >臨時表空間不足問題

臨時表空間不足問題

    今晚開發臨時拉我去定位一個數據庫問題,是臨時表空間不足的問題,主要是他們的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