oracle的臨時表空間寫滿磁碟空間,解決改問題的具體步驟

mengzhaoliang發表於2008-09-19

oracle的臨時表空間寫滿磁碟空間,一般在資料庫的alert_sid.log日誌中發生這樣的錯誤:

Wed Oct 22 17:13:40 2008

ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMP

解決改問題的具體步驟
 
   在檢查aix5.3系統的磁碟空間時,發現臨時表空間所在臨時資料檔案已經達到20G,已經佔用了100%。
因為是正式資料庫伺服器,不能隨便重啟資料庫。

以下的操作是用資料庫的sys超級使用者操作
剛開始打算把臨時表空間的資料檔案重新縮小就好了
執行:
SQL> alter database tempfile
  2  '/oracle/oms/oradata/temp/temp01.dbf' resize 10240M;
資料庫報錯,重新設定的空間大小不能滿足需要。

看來需要重新建立新的臨時表空間替換當前的表空間了

1、首先檢視當前的資料庫預設表空間:
SQL>select * from database_properties
where property_name='DEFAULT_TEMP_TABLESPACE';

確認當前的臨時表空間為TEMP

2、檢視目前臨時表空間的大小:
SQL>select file_name,tablespace_name,bytes/1024/1024 "MB",autoextensible from dba_temp_files;


3、建立新的臨時表空間:(先在其他的磁碟空間借用一下空間)
SQL> create temporary tablespace temp02
  2  tempfile '/oracle/oms/oradata/undo/temp02.dbf'
  3  size 512M;

4、把新建的臨時表空間卻換成資料庫的預設臨時表空間
SQL> alter database default temporary tablespace temp02;


5、確認目前資料庫的預設臨時表空間
SQL>select * from database_properties
where property_name='DEFAULT_TEMP_TABLESPACE';

確認temp02為當前的資料庫預設表空間

6、在刪除temp臨時表空間之前,先把執行在temp臨時表空間的sql語句kill掉,這樣的sql語句多為排序的語句
SQL>Select se.username,se.sid,se.serial#,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;

 查詢出來之後,kill掉這些sql語句:
SQL>alter system kill session '524,778';    (假如某一條執行的sql語句的SID為524,serial#為778)

確認在temp臨時表空間中沒有執行的sql語句之後,則可以刪除temp臨時表空間資料檔案了

7、刪除temp臨時表空間
SQL> drop tablespace temp including contents and datafiles;

這樣很快就可以刪除了臨時表空間的資料檔案

8、現在temp02臨時表空間佔據了別人的磁碟空間,需要重新把臨時表空間建立在原來的位置,重新建立temp臨時表空間
SQL> create temporary tablespace temp
  2  tempfile '/oracle/oms/oradata/temp/temp01.dbf'
  3  size 512M autoextend on maxsize 15G;

新建一個512M的自動擴充套件臨時表空間,最大的擴充套件為15G。

  檢視新建的temp臨時表空間是否正確:
SQL>select file_name,tablespace_name,bytes/1024/1024,maxbytes/1024/1024,autoextensible from dba_temp_files;

9、把新建的temp臨時表空間卻換成資料庫的預設臨時表空間
SQL> alter database default temporary tablespace temp;


10、確認目前資料庫的預設臨時表空間
SQL>select * from database_properties
where property_name='DEFAULT_TEMP_TABLESPACE';

確認temp為當前的資料庫預設表空間


11、目前把原來的temp臨時表空間變成了512M,把剩餘的磁碟空間空了出來,temp02臨時表空間就沒有用了,刪除temp02臨時表空間
SQL> drop tablespace temp02 including contents and datafiles;


至此,完畢!

 


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12778571/viewspace-450257/,如需轉載,請註明出處,否則將追究法律責任。

相關文章