zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    构建之法阅读笔记04
    构建之法阅读笔记03
    关于博客园的一些建议
    书的价钱
    找水王续
    《用户故事与敏捷开发》阅读笔记04
    每周学习进度——第六周
    每周学习进度——第五周
    《用户故事与敏捷开发》阅读笔记03
    软件需求与分析课堂讨论一
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12466698.html
Copyright © 2011-2022 走看看