縮小temp的空間


先建立一個新的temp file到tablespace
alter tablespace temp add tempfile '/erptest/clonedata/temp03.dbf' size 1000m;

將指定的temp file離線
alter database tempfile '/erptest/clonedata/temp02.dbf' offline;

刪除temp file
alter database tempfile '/erptest/clonedata/temp02.dbf' drop including datafiles;

alter database tempfile '/erptest/clonedata/temp02.dbf';

如果出現下列錯誤,表示仍有人在使用指定的temp file
ERROR at line 1:
ORA-25152: TEMPFILE cannot be dropped at this time

找出temp file的id
select file_id from dba_temp_files where file_name ='/erptest/clonedata/temp02.dbf';

   FILE_ID
----------
         2
         
但是這個file_id=2並不是temp file真正的id,必須要再加上參數db_files的值才是真正的file id。
SQL> show parameter db_files

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_files                             integer                          200

所以temp02.dbf真正的id是200+2=202

找出誰在使用
select c.spid,
         b.tablespace,
         b.segfile#,
         b.segblk#,
         round(((b.blocks * d.VALUE) / 1024 / 1024), 2) size_mb,
         a.SID,
         a.serial#,
         a.username,
         a.osuser,
         a.program,
         a.status
    from v$session a, v$sort_usage b, v$process c, v$parameter d
    where b.segfile# = &seg_temp_file_id
      and d.name = 'db_block_size'
      and a.saddr = b.session_addr
      and a.paddr = c.addr
    order by b.tablespace, b.segfile#, b.segblk#, b.blocks;
會提示輸入seg_temp_file_id的值,輸入202就可以找出session,再將這些session刪除就可以drop temp file了。

Oracle DB的listener.log清理