首先是來自服務器的硬盤告警,DBA上去轉了一圈,說是系統根目錄有一個mysql的臨時目錄/tmp,這個目錄存在mysqld已經刪除可是沒有釋放資源的文件,他沒有辦法恢復,從log中找不到任何蛛絲馬跡,找了兩個業務,查了一遍服務,也沒有發現異常的點,問題逐漸演變成:mysql
「linux怎麼從一個已經失去硬連接的文件,如何恢復?」的問題linux
這可給我上了一課,強中自有強中手,高手解決問題果真獨具一格sql
lsof -p xx,看了一下進程未釋放的文件,而後到/proc/<pid>/fd下找到了對應的內存中剩餘了一個文件句柄作的硬連接,服務器
ll /proc/<pid>/fd|grep MLfcmlkt less
而後直接cp xxx /data/tmpfile3d
這樣操做吧進程要刪除的臨時文件整回來了,直接less進去,頭部查到了庫名和表名,見到了操做的數據,發給業務一看,業務當即就明白了,再到Binlog裏搜索了一下對應表的操做,原來是這個表超級大,業務要定時清理裏面的內容,一條delete語句,一下刪除的數據就有17GB, 且應用使用的鏈接池,會話不釋放,刪除的臨時文件句柄就一直保留,進而就撐爆了臨時目錄。blog