昨天在一個客戶環境,由於空間緊張,刪除了一個文件,遇到了文件句柄與空間釋放的問題,記錄一下。
在系統上,臨時表空間擴展到了32G,我新建了一個臨時表空間,並切換了數據庫設置:[oracle@corde tdb]$ ls -sort
total 35101212
51264 -rw-r----- 1 oracle 52429312 Oct 20 08:58 redo02.log
51264 -rw-r----- 1 oracle 52429312 Oct 20 10:24 redo03.log
5144 -rw-r----- 1 oracle 5251072 Oct 20 10:29 users01.dbf
32943240 -rw-r----- 1 oracle 34358697984 Oct 20 10:35 temp01.dbf
1035268 -rw-r----- 1 oracle 1059069952 Oct 20 10:39 undotbs01.dbf
430516 -rw-r----- 1 oracle 440410112 Oct 20 10:39 sysaux01.dbf
512516 -rw-r----- 1 oracle 524296192 Oct 20 10:40 system01.dbf
51264 -rw-r----- 1 oracle 52429312 Oct 20 10:40 redo01.log
6912 -rw-r----- 1 oracle 7061504 Oct 20 10:40 control03.ctl
6912 -rw-r----- 1 oracle 7061504 Oct 20 10:40 control02.ctl
6912 -rw-r----- 1 oracle 7061504 Oct 20 10:40 control01.ctl
之前空間已經使用了88%:
/dev/sda3 80632188 66675432 9860584 88% /data1
然後刪除這個文件,發現空間並未釋放:
[oracle@corder tdb]$ rm temp01.dbf
[oracle@corder tdb]$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
5611984 160272 5166632 4% /
/dev/sda1 101086 12495 83372 14% /boot
/dev/sda3 80632188 66675432 9860584 88% /data1
這是由於Linux/Unix上,該文件可能仍被其他進程使用的緣故,文件句柄未完全釋放,空間無法釋放出來,屬於常見問題,可以通過lsof工具來查看哪些進程鎖定了該文件:
[root@db]# lsof|grep temp
oracle 3167 oracle 38uW REG 8,2 1048584192 4497986 /data3/oradata/temp01.dbf
oracle 3173 oracle 35u REG 8,2 1048584192 4497986 /data3/oradata/temp01.dbf
oracle 3894 oracle 22u REG 8,3 34358697984 3808524 /data1/xcrtdb/temp01.dbf (deleted)
oracle&nb
sp; 3894 oracle 25u REG 8,2 1048584192 4497986 /data3/oradata/temp01.dbf
我們可以看到雖然文件標記為刪除(deleted),但是仍然被幾個進程鎖定:
[root@XcorderDB xcrtdb]# ps -ef|grep 3894
oracle 3894 1 10 07:35 ? 00:19:38 ora_j000_xcrtdb
root 18974 16849 0 10:49 pts/3 00:00:00 grep 3894
[root@XcorderDB xcrtdb]# ps -ef|grep 12576
oracle 12576 1 0 Oct19 ? 00:00:24 oraclexcrtdb (LOCAL=NO)
root 18992 16849 0 10:49 pts/3 00:00:00 grep 12576
[root@XcorderDB xcrtdb]# ps -ef|grep 24544
oracle 24544 1 0 Oct19 ? 00:00:19 oraclexcrtdb (LOCAL=NO)
root 19018 16849 0 10:49 pts/3 00:00:00 grep 24544
如果可以kill這些進程,句柄就可以釋放出來,否則可以重啟數據庫,之後即會釋放。
Aix上lsof的參考文檔: http://www.ibm.com/developerworks/aix/library/au-lsof.html