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