各位新朋友~记得先点蓝字关注我哦~
某天笔者在拷贝一份大日志文件到data目录下时,发现磁盘空间已经满了。经常使用linux的朋友相信对以下这个报错都不陌生:No space left on device(设备上没有剩余空间)
此时我们查看操作系统空间可以明确的看到/data目录使用率已经达到100%
01丨磁盘空间被占用该怎么办
遇到这种情况首要的事情当然是分析目录空间占用来清理多余的文件。可以使用命令du -sm /data/* |sort -rn分析(单位为MB)
有时候目录下文件数量过多时,可以加上head来显示最大的几个文件
咦,这里面的文件最大仅仅一个多G,所有文件加起来更是不到两个G。为什么df -h得到的结果却是已经使用了30G空间呢?
笔者查阅资料后才发现,在linux系统中,如果被删除的文件还有其他进程在使用,那么系统仅会删除其目录节点,且将该文件标记为deleted(类似windows下的回收站状态),此时进程仍然可以读取该文件,磁盘空间也一直被占用。
而我们知道du命令是根据节点信息来统计大小的,所以当我们用du来查看时,是不统计被删除的节点的,从而导致与df的结果不一致。
02丨解决方法
遇到这种情况该怎么办呢?我们可以使用命令lsof |grep deleted来查看被标记为deleted的文件。
可以看到/data目录下有一个bigfile.txt的文件被标记为deleted,正在使用它的进程PID为3671。
根据进程号,我们可以查到是什么进程在占用已经删除了的文件。
到了这里了我们就有两种选择:
1.根据PID号kill掉占用文件的进程。
2.找到使用这个文件的应用并停止应用,让os主动回收磁盘空间。
像笔者这个环境,已经不需要使用这个文件了,所以笔者直接根据PID停止进程。但在生产环境中需要小心确认哦。
03丨扩展
有时候可能会遇到有些已经被标记为deleted的文件是被误删的情况。那么有办法可以恢复这些文件吗?答案是肯定的。
进入到/proc/{PID}/fd目录下,我们可以看到3对应/data/listener.log(deleted)。这个文件就是我们需要的文件。
通过cp 3 /data/listener.log命令恢复文件。
使用此方法恢复文件的前提是这个进程必须仍然存在。
参考文献
https://www.cnblogs.com/paul8339/p/6381946.html
https://segmentfault.com/a/1190000000461077
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。