■ 河南 劉進(jìn)京
單位一臺Oracle服務(wù)器近來出現(xiàn)宕機現(xiàn)象,當(dāng)重啟后,Oralce出現(xiàn)“TNSperating system resouce quota exceeded”、“TNSrotocol adapter error”、“Opreating system resource quota exceeded”、“No space left on device”之類的錯誤提示。據(jù)此判斷,這可能是因為磁盤空間不足,造成Oracle監(jiān)聽程序無法啟動。
在Linux提示符下執(zhí)行“df -h”命令,在列表中的“Filesystem”欄中顯示所有的磁盤設(shè)備,在“Avail”列中顯示其剩余空間,因為Oracle安裝“/var”分區(qū),該分區(qū)還存在幾十個GB的自由空間,完全可以滿足Oracle監(jiān)聽文件存儲日志的需要。
Linux磁盤空間管理機制比較特殊,我們平時接觸到的僅僅是Linux的物理磁盤空間。此外,Linux還提供了針對inode節(jié)點使用的磁盤空間以及存儲信號量的磁盤空間管理功能。inode節(jié)點(也稱為索引節(jié)點)的作用是用來存儲元數(shù)據(jù)信息的區(qū)域。因為在Linux中,文件的存儲包含數(shù)據(jù)塊和元數(shù)據(jù),數(shù)據(jù)塊是文件存儲的最小單元,存儲在多個連續(xù)的扇區(qū)上,大小一般為4KB,通常占用8個扇區(qū)。元數(shù)據(jù)用來存儲文件的基本信息,例如創(chuàng)建者、創(chuàng)建日期、文件屬性等內(nèi)容。
對于inode節(jié)點,存儲的是文件屬性信息,自然也會占用一定的磁盤空間。當(dāng)磁盤格式化之后,Linux就會將磁盤劃分為數(shù)據(jù)區(qū)和inode區(qū),分別用來存儲數(shù)據(jù)和inode元數(shù)據(jù)。對于inode節(jié)點,通常為128或者256字節(jié)。
每個inode節(jié)點都擁有唯一的編碼,Linux使用inode編碼來區(qū)分不同的文件。例如,執(zhí)行“l(fā)s -i test.txt”命令,可以查看指定文件的對應(yīng)的inode編 碼。 執(zhí) 行“stat test.txt”命令,可以查看指定文件詳細(xì)的inode信息。執(zhí)行“dumpe2fs -h /dev/sda2 |grep 'Inode count'”命令,可以查看指定分區(qū)(這里為“/dev/sda2”)可用的inode節(jié)點的總數(shù)量。
根據(jù)以上分析,如果Oracle所在的分區(qū)鎖使用的inode節(jié)點消耗殆盡,同樣會出現(xiàn)磁盤不足的錯誤提示。執(zhí)行“df -i”命令,在系統(tǒng)可用inode信息中發(fā)現(xiàn)“/var”分區(qū)對應(yīng)的“IUse%”列的值為“100%”,這說明其可用的inode節(jié)點已經(jīng)耗盡。
雖然從表面看起來該分區(qū)還存在大量的可用空間,但文件系統(tǒng)在該分區(qū)中的可用inode節(jié)點空間已經(jīng)用完,自然在該分區(qū)中無法新建文件或者文件夾,造成上述Oracle監(jiān)聽程序啟動失敗的情況。
了解了引發(fā)Oracle監(jiān)聽程序無法啟動的原因后,就可以大體判斷問題來源了。應(yīng)該是在Oracle所在的“/var”分區(qū)中某些目錄中產(chǎn)生了數(shù)量巨大的垃圾文件,導(dǎo)致占用了大量的inode節(jié)點,造成該文件inode節(jié)點消耗殆盡。在“/var”目錄下執(zhí)行“du -sh”命令,果 然 發(fā) 現(xiàn)“/var/spool/clientmqueue”目錄存在異?,F(xiàn)象,該目錄居然占用了“/var”分區(qū)將近90%的容量。進(jìn)入該目錄,發(fā)現(xiàn)其中存在數(shù)量龐大的小文件。
經(jīng)過分析,在該Oracle服務(wù)器上運行了很多Crontab定時任務(wù),而這些定時任務(wù)所執(zhí)行的程序如果有數(shù)據(jù)輸出,就會將郵件信息發(fā)送給執(zhí)行cron進(jìn)程的用戶。在發(fā)送郵件時,Linux會先將郵件保存到“/var/spool/clientmqueue”目錄中,然后等待Mail Transfer Agent程序進(jìn)行處理,而該程序的作用是轉(zhuǎn)移這些郵件,并通過SenMail服務(wù)來發(fā)送郵件。但是該服務(wù)器上并沒有啟動SenMail服務(wù),所有的郵件信息就會存儲到該目錄中了。日積月累,在該目錄下會存儲數(shù)量驚人的小文件。
我們只要將這些垃圾文件刪除,就可以解決上述問題。執(zhí)行“rm *”命令,卻出 現(xiàn)“argument list too long”的提示,刪除操作無法進(jìn)行。最簡單的處理方法是分段刪除。執(zhí)行“rm[a-h]* -rf”,“rm [i-q]*-rf”,“rm [r-z]* -rf”命令,按照文件名稱起始字符序號分段刪除。也可以利用Find命令,對文件列表進(jìn)行篩選,刪除符合要求的文件,執(zhí)行“find /var/spool/clientmqueue/ -name '*'-exec rm -rf {} ”命令,執(zhí)行刪除操作即可。
當(dāng)清除了“/var”分區(qū)中的大量的垃圾文件后,可以順利啟動Oracle監(jiān)聽程序了。