2014年12月21日

刪除/縮小 TEMP Tablespace 的檔案大小

Oracle 資料庫必定會有一個 TEMPORARY 的 Tablespace ,主要做為建立暫存資料的時候使用,
有時候建立臨時表的資料量過大,就會不斷的增加 TEMPORARY 的 Tablespace 的檔案容量,
增加後就無法縮小了,就必須要刪除然後再重新建立。

在 TIPTOPGP 5.x ERP 的 4GL 程式中,CREATE TEMP TABLE xxxx AS ....,
並不是在 Oracle 資料庫的 TEMPORARY 建立臨時表,而是在 TIPTOP 的 TEMPTABS 的 Tablespace 建立。
主要原因是 Oracle 的 TEMPORARY 的 Tablespace 只能同一個 Session 才能存取的到,
所以 TIPTOP 是用一般的 Tablespace 的方式來建立,避免 Debug 或呼叫其他程式執行時,就找不到 Temp Table 的情況。

每一個 Tablesapce 是由一個或數個 Datafile 所組成的,像 DBS1 的 Tablespace 不足時就要手動增加 Datafile 讓 DBS1 的 Tablespace 加大。

再來就是如何減少 TEMPORARY 的 Tablespace 了,只能先建立新的 TEMPORARY 再轉移再刪除舊檔的方式。

建立新的 TEMPORARY Tablespace,檔案大小改為 100M,並自動增長每次加 640K。
CREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE
  '/u2/oracle/oradata/topprod/temp01.dbf' SIZE 100M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
TABLESPACE GROUP ''
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

查詢目前資料庫有幾個 TEMPORARY 。
select * from dba_temp_free_space;

查詢目前資料的的主要 TEMPORARY。
select DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE from dba_users where username='SYS';

切換 TEMPORARY 到名稱為 temp1 的 Tablespace。
alter database default temporary tablespace temp1

刪除舊名稱為 temp 的 TEMPORARY Tablespace 的 Datafile 所有檔案。
drop tablespace temp including contents and datafiles;

如果刪除的時候 Hang 住的話,表示 TEMPORARY 正在使用中,查詢正在使用的狀況。
SELECT b.tablespace,b.segfile#,b.segblk#,b.blocks,a.sid,a.serial#,
a.username,a.osuser, a.status
FROM v$session a,v$sort_usage b
WHERE a.saddr = b.session_addr;

如果要減少的話,就是再增加原本的名稱為 TEMP 後,再切換回原本的 TEMP,再刪除TEMP1 的方式。

這樣硬碟可使用空間就變大了。

當然如果覺的 TIPTOP 的 TEMPTABS Tablespace 過大的話,也是可以刪除再重新建立,
有時候跑一些比較大的程式如 axcp120、axcp500…等,資料異常有時候會造成無限圈的情況。就會不斷的增加 TEMPTABS 的 Datafile 大小。

重建 TEMPTABS 的 Tablespace。
DROP TABLESPACE TEMPTABS INCLUDING CONTENTS AND DATAFILES;

CREATE TABLESPACE TEMPTABS DATAFILE
  '/u2/oracle/oradata/topprod/temptabs.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;

1 則留言:

  1. 先謝謝你的文章,但為什麼刪除temp後,df -k 查詢空間,發現不減反增呢?

    回覆刪除