很久沒有寫博文了,今天週六,分享一下剛剛處理完的一個小故障php
現象描述:node
運營妹紙那邊反應運營後臺報錯,具體以下:mysql
一開始覺得是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
登錄進數據庫,查看數據庫表,能夠select表數據,可是desc結構的時候,連續desc了幾張表,結果都同樣,報如下錯誤:url
難道是表損壞了?屁顛屁顛執行表修復命令,命令以下:spa
/usr/local/mysql/bin/mysqlcheck --all-databases -uUSERNAME -pPASSWORD -r
部分表修復過程以下:
修復完成以後,媽蛋,仍是同樣的報錯信息,
仔細看看,媽蛋,這是寫不了臨時文件的意思嗎?可是爲何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值最快的找到相對應的文件。