ORACLE 臨時表空間管理


 臨時表空間和臨時段

  臨時表空間用於存放排序、臨時表等數據,其信息不需要REDO,因此臨時表的DML操作往往比普通表產生的REDO少很多。臨時表數據變化不產生REDO,UNDO數據變化產生REDO。臨時段不僅僅存在於臨時表空間中,也可能存在普通表空間。比如通過CTAS創建一張表,新表的數據放在臨時段中,這些臨時段在CTAS完成的時候會被轉換為PERMENT段。ORACLE7.3版本之前,臨時段是在需要時分配,使用完畢后被刪除.ORACLE7.3 推出的新算法的核心就是SEP(SORT EXTENT POOL),SEP 負責管理臨時段中擴展的結構,存儲在共享池內,任何需要使用排序空間的操作,都需要從SEP 中分配空閑的擴展,使用完畢后,不需要釋放該空間,只需要在SEP 中將該擴展設置為空閑。
  當數據庫實例啟動后,SMON 將會刪除該實例未釋放的臨時段,並且對臨時表空間進行碎片整理。在這個操作完成前,數據庫打開的操作不能完成。因此每次數據庫重啟后,臨時段中的垃圾都會被完全清理。當數據庫打開后,第一個進行的硬盤排序操作會在相關的臨時表空間內創建臨時段,這個臨時段也是整個實例唯一的臨時段(在新的臨時段算法下,同一個表空間內,每個實例只有一個臨時段)。臨時段中擴展的信息會被記錄在SEP 中。硬盤排序操作會在SEP 中查找可用的擴展,在查找前,需要獲得SORT EXTENT POOL 閂鎖。如果能找到可用的擴展,那么SEP 中已被分配的擴展就會被標注為占用狀態;如果找不到可用的擴展,那么系統就會試圖從表空間中分配新的空間,而如果這個分配工作因為表空間的空閑空間不足而無法完成,那么就會產生一個ORA-1652 錯誤。當排序操作完成的時候,會再次獲取SORT EXTENT POOL 閂鎖,並且將使用的擴展標注為空閑,然后釋放SORT EXTENT POOL 閂鎖。新的臨時表空間管理算法不需要頻繁地分配和釋放臨時段,這大大提高了臨時段管理的效率。由於這是一種只分配不釋放的算法,因此DBA 經常會看到自己的臨時表空間總是處於或者接近100%使用的狀態。其實對於7.3 以后的版本而言,臨時表空間使用率接近100%是十分正常的,DBA 可以通過V$SORT_USAGE 和V$SORT_SEGMENTS 這兩個視圖來檢查臨時段的使用情況。
  在RAC/OPS環境下,臨時段的管理算法也是類似的。在RAC 中,由於多個實例會共享一個臨時表空間,因此這些實例也能夠共享相同的擴展。在RAC環境下,每個實例都擁有獨立的SEP,各個實例中的排序操作需要在自己的SEP中分配空間。如果SEP 中無法分配到足夠的空間,那么首先會在表空間中分配;而如果表空間也已經分配完畢,這時若其他的實例還有空閑的擴展,那么這個擴展就可以分配給需要的實例使用。這些操作都是不可見的,雖然SERVER 進程不會收到ORA-1652 的錯誤信息,但是在ALTER LOG 中會有一個ORA-1652 的記錄。

臨時表空間的使用情況:
SELECT TU.TABLESPACE_NAME AS "TABLESPACE_NAME",
TT.TOTAL - TU.USED AS "FREE(G)",
TT.TOTAL AS "TOTAL(G)",
ROUND(NVL(TU.USED, 0) / TT.TOTAL * 100, 3) AS "USED(%)",
ROUND(NVL(TT.TOTAL - TU.USED, 0) * 100 / TT.TOTAL, 3) AS "FREE(%)"
FROM (SELECT TABLESPACE_NAME,
SUM(BYTES_USED) / 1024 / 1024 / 1024 USED
FROM GV_$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) TU ,
(SELECT TABLESPACE_NAME,
SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) TT
WHERE TU.TABLESPACE_NAME = TT.TABLESPACE_NAME;


查詢會話使用臨時表空間
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;
或者:

SELECT B.TABLESPACE,
    B.SEGFILE#,
    B.SEGBLK#,
    B.BLOCKS,
    B.BLOCKS * 32 / 1024 / 1024,
    A.SID,
    A.SERIAL#,
    A.USERNAME,
    A.OSUSER,
    A.STATUS,
    C.SQL_TEXT,
    B.CONTENTS
 FROM V$SESSION A, V$SORT_USAGE B, V$SQL C
WHERE A.SADDR = B.SESSION_ADDR
  AND A.SQL_ADDRESS = C.ADDRESS(+)
  and status = 'ACTIVE'
ORDER BY B.BLOCKS DESC

查看臨時表空間的空閑情況
SELECT TABLESPACE_NAME,FILE_ID,BYTES_USED/1024/1024,BYTES_FREE/1024/1024 FROM V$TEMP_SPACE_HEADER;


數據庫中消耗資源比較大的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;


或者:
select su.username,su.Extents,tablespace,segtype,sql_text  from v$sort_usage su,v$sql s Where su.SQL_ID = s.SQL_ID;


常見占用臨時表空間的幾種情況
1:order by or group by (disc sort占主要部分);
2:索引的創建和重創建;
3:distinct操作;
4:union & intersect & minus sort-merge joins;
5:analyze 操作;
6:有些異常也會引起TEMP的暴漲。


臨時表空間使用率過高,日常維護
確定數據庫schema的默認表空間
select username,temporary_tablespace from dba_users where account_status ='OPEN';

確定數據庫的默認臨時表空間

select * from database_properties where property_name ='DEFAULT_TEMP_TABLESPACE';

1.創建中轉臨時表空間
create temporary tablespace temp2 tempfile '/data/app/oracle/oradata/prod/temp02.dbf' size 512M autoextend on next 1M maxsize unlimited;

2.改變缺省臨時表空間為中轉臨時表空間TEMP2
alter database default temporary tablespace TEMP2;
驗證用戶的臨時表空間為TEMP2
select username,temporary_tablespace from dba_users where account_status ='OPEN';

3.刪除原臨時表空間
drop tablespace temp including contens and datafiles;

4.重建臨時表空間
create temporary tablespace temp tempfile '/data/app/oracle/oradata/prod/temp01.dbf' size 512M autoextend on next 1M maxsize unlimited;

5.重置缺省臨時表空間為新建的TEMP表空間
alter database default temporary tablespace TEMP1;

驗證用戶的臨時表空間為TEMP
select username,temporary_tablespace from dba_users where account_status ='OPEN';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM