一個由INode節點爆滿引發的業務故障

很久沒有寫博文了,今天週六,分享一下剛剛處理完的一個小故障php


現象描述:node

運營妹紙那邊反應運營後臺報錯,具體以下:mysql

wKioL1ba6RyAMcIEAADNML8EkwI987.png



一開始覺得是tmp的目錄沒有權限寫入,查看目錄權限,777,不是這個問題;nginx


查看nginx的錯誤日誌,部分錯誤信息以下,500錯誤:sql

113.xx.xx.48 - - [05/Mar/2016:19:33:09 +0800] "POST /index.php?r=site/login HTTP/1.1" 500 112266 "http://xxx.xxx.com/index.php?r=site/login" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"數據庫

14.xx.xx.67 - - [05/Mar/2016:19:33:14 +0800] "GET /index.php?r=site/login HTTP/1.1" 500 120922 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"vim



查看mysql的錯誤日誌,日誌以下,可是查看了較早之前,也有如下報錯,以前不出現問題,爲何恰恰這時候報錯,應該不是這個問題引發的,繼續查...ide

wKioL1ba6qfgqeMuAAApwuNVerw958.png


登錄進數據庫,查看數據庫表,能夠select表數據,可是desc結構的時候,連續desc了幾張表,結果都同樣,報如下錯誤:url

spacer.gifwKiom1ba7VmD_p_GAAAPHRiR09M895.png


難道是表損壞了?屁顛屁顛執行表修復命令,命令以下:spa

/usr/local/mysql/bin/mysqlcheck --all-databases -uUSERNAME -pPASSWORD -r


部分表修復過程以下:

wKiom1ba7fryyMTbAAAvR5lTx8o949.png



修復完成以後,媽蛋,仍是同樣的報錯信息,



仔細看看,媽蛋,這是寫不了臨時文件的意思嗎?可是爲何desc會涉及建立臨時文件的問題呢?有待深究!!

ERROR 1 (HY000):Can't create/write to file '/tmp/#sql_3b25_0.MYI' (Errcode:28)




是否是磁盤空間滿了?沒收到報警信息啊。。。抱着疑惑的心態查看了下磁盤空間,具體以下:

[root@xxxxxx ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/xx1       20G  6.9G   12G  37% /

tmpfs           3.9G     0  3.9G   0% /dev/shm

/dev/xxx        63G   26G   34G  44% /mnt


沒滿啊。。。奇怪。。看下my.cnf文件是否是有什麼改動。


vim的時候報了一個錯誤。以下:

E303:Unable to open swap file for "my.cnf",recovery impossible


一開始沒留意,繼續編輯,看了下文件裏面的內容,沒改動啊,權限和屬主也是正常的,那就奇怪了。。


而後vim一下其餘文件,也是有提示錯誤。。。。沒法建立交換文件。。



因而我試試touch一下,哎呀,建立不了新文件,mkdir呢,也是同樣。。提示沒有磁盤空間。。。

touch: cannot touch `e': No space left on device


剛剛df -h不是很明顯還有空間麼。難道是文件的節點數滿了?果斷df -i一下。。。

[root@xxxx ~]# df -i

Filesystem      Inodes  IUsed   IFree IUse% Mounted on

/dev/xxx     1310720 171826 1138894   100% /

tmpfs          1007261      1 1007260    1% /dev/shm

/dev/xxx      4194304 463685 3730619   12% /mnt



果真,/目錄的節點數使用了100%,因而,問題找到了,那再查查究竟是什麼文件佔用了這麼多的文件節點.


最後定位到/var/spool/clientmqueue下面有不少的小文件。

說明:系統中cron執行的程序有輸出內容,輸出內容會以郵件形式發給cron的用戶,而sendmail沒有啓動因此就產生了這些文件;



既然知道這個文件產生的緣由,刪除掉唄,當前保證業務能正常運行最重要。


cd到/var/spool/clientmqueue這個目錄下,使用rm -rf ./*  ,哎呀,不給刪?報錯:

/bin/rm: argument list too long

最後使用ls |xargs rm -rf 刪除。。。。

說明:使用rm默認接收的參數是有限的,使用此命令能夠將文件名輸出而且分組刪除。。


使用df -i再次查看,/目錄的節點數也釋放了一些。再次訪問業務,搞定!!

[root@xxxx clientmqueue]# df -i

Filesystem      Inodes  IUsed   IFree IUse% Mounted on

/dev/xxx     1310720 171826 1138894   14% /

tmpfs          1007261      1 1007260    1% /dev/shm

/dev/xxx      4194304 463685 3730619   12% /mnt



說明:inode譯成中文就是索引節點,每一個存儲設備(例如硬盤)或存儲設備的分區被格式化爲文件系統後,應該有兩部份,一部份是inode,另外一部份是Block,Block是用來存儲數據用的。而inode呢,就是用來存儲這些數據的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權限等。inode爲每一個文件進行信息索引,因此就有了inode的數值。操做系統根據指令,能經過inode值最快的找到相對應的文件。

相關文章
相關標籤/搜索