OS 刪除temp表空間 而磁碟空間未釋放的解決方案

dbhelper發表於2015-01-17


標題:OS 刪除temp表空間 而磁碟空間未釋放的解決方案 

作者:lōττéry©版權所有[文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任.]



2013-04-29 17:57:47的筆記.今天發現說很亂,此文特加以整理


場景:
昨天在系統上刪除了32G的temp01.dbf檔案,結果還沒有釋放磁碟空間 df -hl看下/目錄還是使用100%
未釋放磁碟空間原因:在Linux或者Unix系統中,透過rm或者檔案管理器刪除檔案將會從檔案系統的目錄結構上解除連結(unlink).然而如果檔案是被開啟的(有一個程式正在使用),那麼程式將仍然可以讀取該檔案,磁碟空間也一直被佔用.

所有在用命令drop tablespace temp [including contents and datafiles];會停在那裡
等待事件:
SQL> SELECT SID,SEQ# EVENT,P1TEXT,P2TEXT,P3TEXT,STATE FROM v$session_wait s where s.SID=159;
 
SID   SEQ# EVENT                   P1TEXT  P2TEXT          P3TEXT  STATE
----------------------------------------------------------------------------
159   440  enq: TS - contention  name|mode tablespace ID   dba    WAITING
SQL>  


如下解決方案①②可以將OS磁碟空間釋放和temp表空間刪除:
① 
可以透過在系統上執行lsof |grep ..看下已經刪除但仍被應用程式佔用的檔案列表

 [root@kfdb49 dbs]# lsof |grep deleted | grep TEMP
oracle     1804    oracle   31u      REG              253,0  34359730176    1376405 /oracle/app/product/10.2.0/db_1/dbs/TEMP01.DBF (deleted)


讓os自動回收磁碟空間方法:kill掉相應的程式 或者 停掉使用這個檔案的應用

1)kill -9 1804      ... 再drop tablespace temp including contents and datafiles;
2)restart oracle 對應的空間會被釋放


在重啟的時候注意要 shutdown immediate  等待事物提交完成,再重啟 要是重啟的時候指定了臨時檔案
1、CREATE CONTROLFILE REUSE DATABASE "instance“.....
2、alter database backup controlfile to trace as '新位置';  引數檔案指定好新位置,為了下次啟動使用
3、alter database open;
4、create spfile from pfile;


檢查磁碟空間:
[root@kfdb49 dbs]#  df -hl 



查詢資料庫中誰在用這個temp;


--檢視誰在用這個temp表空間/及其當時的一個結果~
SQL>   select se.SADDR,
         se.SID,
         SE.SERIAL#,
         se.USERNAME,
         se.OWNERID,
         se.STATUS,
         se.OSUSER,
         se.PROCESS,
         se.MACHINE,
         se.TERMINAL,
         se.PROGRAM,
         se.SQL_id,
         su.TABLESPACE,
         su.EXTENTS,
         su.BLOCKS
    FROM v$session se, v$sort_usage su
   WHERE se.saddr = su.session_addr;

SADDR   SID    SERIAL# USERNAME     OWNERID    STATUS   OSUSER      PROCESS      MACHINE             TERMINAL         PROGRAM  SQL_ID   TABLESPACE EXTENTS  BLOCKS
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2133DF5C 158   36     SYS          2147483644 INACTIVE MHQ-PC\mhq  1896:1968    WORKGROUP\MHQ-PC     MHQ-PC       plsqldev.exe                      TEMP      23   2944
 
SQL> 


從結果中發現  STATUS ==> INACTIVE 可以直接透過如下語句kill掉程式來釋放磁碟空間..
語句:
Alter system kill session '158,36'; 
再drop tablespace temp including contents and datafiles;
再檢查磁碟空間:
[root@kfdb49 dbs]#  df -hl 

若 STATUS ==> ACTIVE透過SQL_ID找到對應的sql再和相關人員確認方案...

 


此條目發表在 Oracle 分類目錄。將固定連線加入收藏夾。



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

相關文章