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