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

场景描述

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

你可能感兴趣的:(linux,rm,不释放)