linux刪除文件空間不釋放問題解決

場景描述

某天,收到Prometheus報警,生產中某臺機器出現磁盤空間不足報警,該臺服務器是mysql其中一臺從庫,遠程登陸到該服務後,排查磁盤空間的緣由,發現mysql日誌文件過多,因而清空日誌文件,可是日誌清理後,發現磁盤空間並無釋放,下面分析處理過程和緣由sql

日誌清理後,查看磁盤空間bash

[root@hhjy3-21 ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda3      xfs        98G  65G   33G   73% /
devtmpfs       devtmpfs  1.5G     0  1.5G   0% /dev
tmpfs          tmpfs     1.5G     0  1.5G   0% /dev/shm
tmpfs          tmpfs     1.5G  8.9M  1.5G   1% /run
tmpfs          tmpfs     1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda1      xfs      1014M  120M  895M  12% /boot
tmpfs          tmpfs     293M     0  293M   0% /run/user/0

緣由

在Linux或Unix系統中,經過使用rm刪除文件的原理,rm命令只是從文件系統的目錄結構上解除連接(unlink),也就是說若是文件是被打開的(有一個進程正在使用該文件句柄),那該進程仍是能夠讀取已刪除的文件,而我刪除的正是在運行中的MySQL的Logs,刪除的時候文件正在被使用中,因此並不釋放磁盤空間。服務器

解決方法

Linux中使用lsof | grep deleted命令能夠獲取一個已經被刪除可是仍然被應用程序佔用的文件列表日誌

[root@hskj3-21 ~]# lsof | grep -i delete
mysqld_sa  1311          root    2u      CHR              136,0       0t0          3 /dev/pts/0 (deleted)
mysqld     1607         mysql    1w      REG                8,3    312627    1700052 /mysql/3306/logs/mysql.log (deleted)
mysqld     1607         mysql    2w      REG                8,3    312627    1700052 /mysql/3306/logs/mysql.log (deleted)
mysqld     1607         mysql    5u      REG                8,3         0  134335687 /mysql/3306/tmp/ibz8LDOk (deleted)
mysqld     1607         mysql    6u      REG                8,3         0  134374089 /mysql/3306/tmp/ibprHY8C (deleted)
mysqld     1607         mysql    7u      REG                8,3         0  135173881 /mysql/3306/tmp/ibS7LjtV (deleted)
mysqld     1607         mysql    8u      REG                8,3         0  134429856 /mysql/3306/tmp/ibX2QZcx (deleted)
mysqld     1607         mysql   12u      REG                8,3         0  134429858 /mysql/3306/tmp/ibMxDsTQ (deleted)
mysqld     1607         mysql   21w      REG                8,3    153673    1700035 /mysql/3306/logs/slow.log (deleted)
mysqld     1607  1609   mysql    1w      REG                8,3    312627    1700052 /mysql/3306/logs/mysql.log (deleted)
......

用該命令後,我發現佔用的文件列表很是多,咱們須要將佔用已刪除文件的進程給一個一個的殺掉code

[root@hskj3-21 ~]# kill -9 PID

在線清空文件

其實上面那種直接rm刪除文件的方法很是危險,特別是針對MySQL,Mongodb,數據相關的服務,rm刪除以後,無法釋放空間,還得手動重啓或者kill這些數據相關的服務進程,會影響到業務。進程

可使用如下方法,磁盤空間不足能夠立刻釋放,也能夠保證進程繼續向文件寫入日誌,這種方法適合在線清理。it

$ echo >xxx/log
相關文章
相關標籤/搜索