首页 资讯 社群 我的社区 搜索

linux删除文件空间不释放问题解决

yimo~
2020-04-02 11:55:57

场景描述

某天,收到Prometheus报警,生产中某台机器出现磁盘空间不足报警,该台服务器是mysql其中一台从库,远程登录到该服务后,排查磁盘空间的原因,发现mysql日志文件过多,于是清空日志文件,但是日志清理后,发现磁盘空间并没有释放,下面分析处理过程和原因

日志清理后,查看磁盘空间

[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)
......

用该命令后,我发现占用的文件列表非常多,我们需要将占用已删除文件的进程给一个一个的杀掉

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

在线清空文件

其实上面那种直接rm删除文件的方法非常危险,特别是针对MySQL,Mongodb,数据相关的服务,rm删除之后,没法释放空间,还得手动重启或者kill这些数据相关的服务进程,会影响到业务。

可以使用以下方法,磁盘空间不足可以马上释放,也可以保证进程继续向文件写入日志,这种方法适合在线清理。

$ echo >xxx/log
用户评论