Oracle (temporary tablespace)臨時表空間說明

目錄

一、臨時表空間作用... 2

二、臨時表空間釋放... 2

法一、重啓庫... 2

法二、Metalink給出的一個方法... 3

法三、我常用的一個方法... 3

法四、使用診斷事件的一種方法... 3

法五、 重建TEMP 表空間... 3

三、臨時表空間增刪改... 3

1、改變臨時表空間大小... 3

3、創建臨時表空間... 3

4、更改系統的默認臨時表空間... 3

5、刪除臨時表空間... 3

6、臨時表空間組介紹... 3

7、對臨時表空間進行shrink(11g新增的功能)... 3

四、臨時表空間查詢... 3

1、查看臨時表空間是否可用... 3

2、查看臨時表空間的使用情況... 3

3、 查找消耗資源比較的sql語句... 3

五、臨時表空間回收測試... 3

 

 

 

 

 

 

 

 

 

 

 

 

關於oracle臨時表空間

一、臨時表空間作用

臨時表空間主要用途是在數據庫進行排序運算、管理索引、訪問視圖等操作時提供臨時的運算空間,當運算完成之後系統會自動清理。當oracle裏需要用到sort的時候,PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間裏進行排序,同時如果有異常情況的話,也會被放入臨時表空間,正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作後,Oracle是會自動釋放掉臨時段的。注意這裏的釋放,僅僅是將這些空間標記爲空閒,並可重用,真正佔用的磁盤空間並沒有釋放。所以Temp表空間可能會越來越大。

重啓數據庫可以釋放臨時表空間,如果不能重啓實例,而一直保持問題sql語句的執行,temp表空間會一直增長。直到耗盡硬盤空間。 在磁盤空間的分配上,oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那麼臨時表空間就是1GB。也就是說當前臨時表空間文件的大小是歷史上使用臨時表空間最大的大小。臨時表空間的主要作用:
 (1)索引create或rebuild
 (2)Order by 或 group by
 (3)Distinct 操作
 (4)Union 或 intersect 或 minus
 (5)Sort-merge joins
 (6)analyze

排序是很耗資源的,Temp表空間滿了,關鍵是優化你的語句,儘量使排序減少纔是上策.

 二、臨時表空間釋放

法一、重啓庫

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

法二、Metalink給出的一個方法

    修改一下TEMP表空間的storage參數,讓Smon進程觀注一下臨時段,從而達到清理和TEMP表空間的目的。
SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;

法三、我常用的一個方法

    1、使用如下語句查看一下認誰在用臨時段
SELECT username,
       sid,
       serial#,
       sql_address,
       machine,
       program,
       tablespace,
       segtype,
       contents
  FROM v$session se,
       v$sort_usage su
WHERE se.saddr=su.session_addr 
   
2   那些正在使用臨時段的進程
SQL>Alter system kill session 'sid,serial#';
   
3、把TEMP表空間回縮一下
SQL>Alter tablespace TEMP coalesce;

法四、使用診斷事件的一種方法

1、 確定TEMP表空間的ts#
SQL>select ts#, name from sys.ts$ ;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
4 TOOLS
5 INDX
6 DRSYS
2、 執行清理操作
SQL>alter session set events 'immediate trace nameDROP_SEGMENTS level 4' ;
說明:
temp
表空間的TS# 爲 3*, So TS#+ 1= 4

法五、 重建TEMP 表空間

Temporary tablespace是不能直接drop默認的臨時表空間的,不過我們可以通過以下方法來做。  

準備:查看目前的TemporaryTablespace

  SQL> select namefrom v$tempfile

1.創建中轉臨時表空間

create temporarytablespace  TEMP1 TEMPFILE 'E:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512MREUSE AUTOEXTEND ON NEXT  1M MAXSIZE UNLIMITED;

  2.改變缺省臨時表空間 爲剛剛創建的新臨時表空間temp1

  alter databasedefault  temporary tablespace  temp1;

  3.刪除原來臨時表空間

  drop tablespace tempincluding contents and datafiles;

  4.重新創建臨時表空間

  create temporarytablespace  TEMP TEMPFILE 'E:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512MREUSE AUTOEXTEND ON NEXT  1M MAXSIZE UNLIMITED;

  5.重置缺省臨時表空間爲新建的temp表空間

  alter databasedefault  temporary tablespace  temp;

  6.刪除中轉用臨時表空間

  drop tablespacetemp1 including contents and datafiles;

三、臨時表空間增刪改

1、改變臨時表空間大小

  alter database tempfile'C:\ORADATA\ORCL\TEMP01.DBF' resize 21M;   2、擴展臨時表空間

         方法一、增大臨時文件大小:
         SQL> alter databasetempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m;
         方法二、將臨時數據文件設爲自動擴展:
        SQL> alter databasetempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend        on next 5m maxsize unlimited;
         方法三、向臨時表空間中添加數據文件:
       SQL> alter tablespace tempadd tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ size 100m;

    3、創建臨時表空間

  create temporary tablespacetemp01 tempfile 'C:\ORADATA\ORCL\TEMP01.DBF' size 10M;

    4、更改系統的默認臨時表空間

  --查詢默認臨時表空間
  select * from database_properties whereproperty_name='DEFAULT_TEMP_TABLESPACE';
   --修改默認臨時表空間
  alter database default temporary tablespace temp02;
  --所有用戶的默認臨時表空間都將切換爲新的臨時表空間:
  select username,temporary_tablespace,default_tablespace from dba_users;
  --更改某一用戶的臨時表空間:
  alter user scott temporary tablespace temp02;

   5、刪除臨時表空間

  --刪除臨時表空間的一個數據文件:
  alter database tempfile 'C:\ORADATA\ORCL\TEMP03.DBF' drop;
  --刪除臨時表空間(徹底刪除):
  drop tablespace temp including contents and datafiles cascadeconstraints;

6、臨時表空間組介紹

    --1)創建臨時表空間組:
    create temporary tablespace tempts1 tempfile'C:\ORADATA\ORCL\TEMP1_01.DBF' size 2M  tablespace group group1;
     create temporary tablespace tempts2 tempfile'C:\ORADATA\ORCL\TEMP1_02.DBF' size 2M tablespace group group2;
     
    --2)查詢臨時表空間組:dba_tablespace_groups視圖
    select * from dba_tablespace_groups;
   GROUP_NAME                    TABLESPACE_NAME
    ------------------------------------------------------------
   GROUP1                        TEMPTS1
    GROUP2                        TEMPTS2
    --3)將表空間從一個臨時表空間組移動到另外一個臨時表空間組:
    alter tablespace tempts1 tablespace group GROUP2 ;
    select * from dba_tablespace_groups;
   GROUP_NAME                    TABLESPACE_NAME
    ------------------------------ ------------------------------
   GROUP2                        TEMPTS1
   GROUP2                        TEMPTS2
     --4)把臨時表空間組指定給用戶
    alter user scott temporary tablespace GROUP2;
     --5)在數據庫級設置臨時表空間
    --alter database <db_name> default temporarytablespace GROUP2;
    alter database orcl default temporary tablespace GROUP2;
     --6)刪除臨時表空間組 (刪除組成臨時表空間組的所有臨時表空間)
    drop tablespace tempts1 including contents and datafiles;
    select * from dba_tablespace_groups;
    GROUP_NAME                    TABLESPACE_NAME
    ------------------------------------------------------------
   GROUP2                        TEMPTS2
    drop tablespace tempts2 including contents and datafiles;
    select * from dba_tablespace_groups;
   GROUP_NAME                    TABLESPACE_NAME

7、對臨時表空間進行shrink(11g新增的功能)

    --將temp表空間收縮爲20M
    alter tablespace temp02 shrink space keep 20M;
    --自動將表空間的臨時文件縮小到最小可能的大小
    ALTER TABLESPACE temp SHRINK TEMPFILE ’/u02/oracle/data/lmtemp02.dbf’;

四、臨時表空間查詢

1、查看臨時表空間是否可用

SELECT D.TABLESPACE_NAME,SPACE"SUM_SPACE(M)",BLOCKS SUM_BLOCKS,

SPACE-NVL(FREE_SPACE,0)"USED_SPACE(M)",

 ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2)"USED_RATE(%)",

FREE_SPACE"FREE_SPACE(M)" 

FROM  (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,

SUM(BLOCKS) BLOCKS  FROM DBA_DATA_FILES  GROUP BY TABLESPACE_NAME) D, 

(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) FREE_SPACE 

FROM DBA_FREE_SPACE  GROUP BY TABLESPACE_NAME) F 

WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 

UNION ALL  --if have tempfile  

SELECT D.TABLESPACE_NAME,SPACE"SUM_SPACE(M)",BLOCKS SUM_BLOCKS, 

 USED_SPACE"USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2)"USED_RATE(%)",

 NVL(FREE_SPACE,0) "FREE_SPACE(M)"

 FROM  (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,

SUM(BLOCKS) BLOCKS  FROM DBA_TEMP_FILES  GROUP BY TABLESPACE_NAME) D,

 (SELECTTABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,

 ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE 

FROM V$TEMP_SPACE_HEADER  GROUP BY TABLESPACE_NAME) F 

WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+);

2、查看臨時表空間的使用情況

(GV_$TEMP_SPACE_HEADER視圖必須在sys用戶下才能查詢)
    --GV_$TEMP_SPACE_HEADER視圖記錄了臨時表空間的使用大小與未使用的大小
    --dba_temp_files視圖的bytes字段記錄的是臨時表空間的總大小
    SELECT temp_used.tablespace_name,
           total - used as"Free",
           total as"Total",
           round(nvl(total -used, 0) * 100 / total, 3) "Free percent"
      FROM (SELECT tablespace_name, SUM(bytes_used) /1024 / 1024 used
             FROM GV_$TEMP_SPACE_HEADER
             GROUPBY tablespace_name) temp_used,
           (SELECTtablespace_name, SUM(bytes) / 1024 / 1024 total
             FROM dba_temp_files
             GROUPBY tablespace_name) temp_total
     WHERE temp_used.tablespace_name = temp_total.tablespace_name

3、 查找消耗資源比較的sql語句
  Select se.username,
         se.sid,
         su.extents,
         su.blocks *to_number(rtrim(p.value)) as Space,
         tablespace,
         segtype,
         sql_text
    from v$sort_usage su, v$parameter p, v$session se, v$sql s
   where p.name = 'db_block_size'
     and su.session_addr = se.saddr
     and s.hash_value = su.sqlhash
     and s.address = su.sqladdr
   order by se.username, se.sid
  4、查看當前臨時表空間使用大小與正在佔用臨時表空間的sql語句
  select sess.SID, segtype,blocks * 8 / 1000 "MB", sql_text
    from v$sort_usage sort, v$session sess, v$sql sql
   where sort.SESSION_ADDR = sess.SADDR
     and sql.ADDRESS = sess.SQL_ADDRESS
   order by blocks desc;

五、臨時表空間回收測試

詳細測試步驟見附件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章