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

37 篇文章 2 订阅
2 篇文章 0 订阅

场景描述

某天,收到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

原因

LinuxUnix系统中,通过使用rm删除文件的原理,rm命令只是从文件系统的目录结构上解除链接(unlink),也就是说如果文件是被打开的(有一个进程正在使用该文件句柄),那该进程还是可以读取已删除的文件,而我删除的正是在运行中的MySQLLogs,删除的时候文件正在被使用中,所以并不释放磁盘空间。

解决方法

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删除文件的方法非常危险,特别是针对MySQLMongodb,数据相关的服务,rm删除之后,没法释放空间,还得手动重启或者kill这些数据相关的服务进程,会影响到业务。

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

$ echo > xxx/log

CSDN_码404:linux删除文件空间不释放问题解决

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leenhem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值