Ubuntu磁盘空间爆满后输入命令报No space left on device

时间:2024-03-20 09:38:12

最近线上一台ubuntu服务器磁盘空间爆满了,扩容完毕后,发现在命令行界面敲tab键补全命令的时候,Linux会提示:

cannot create temp file for here-document: No space left on device

使用df -h命令查看磁盘使用情况,发现多了一个overflow的文件系统,挂载目录是/tmp,而这个目录只有1MB,使用率100%。
Ubuntu磁盘空间爆满后输入命令报No space left on device
tmp目录原本是挂在/dev/xvda1下的,但因为磁盘爆满的缘故,ubuntu为了系统的正常运行,把tmp独立了出来,并分配了1MB的空间,如果这1MB的空间也使用完了,就会出现上面的No space left on device的报错。在磁盘空间问题解决后,如果不重启系统的话,这个目录并不会自动消失,需要我们自己使用sudo umount -l /tmp命令去卸载,卸载后tmp会重新挂回到/dev/xvda1,至此没有报错了,问题解决。

途中还有一个小插曲:

因为磁盘爆满的服务器是一台MySQL数据库,处理问题期间有停止重启过MySQL,可能因为这个原因导致一个MyISAM数据表损坏了,于是磁盘扩容完毕后,用REPAIR TABLE命令修复这个表,但奇怪的是修复的时间非常长,几个小时都没有修复完,而这个表本身并不大。

查看MySQL的错误日志,发现有出现报错信息:

[Warning] Disk is full writing ‘/tmp/STe9Gfus’ (Errcode: 28). Waiting for someone to free space… (Expect up to 60 secs delay for server to continue after freeing disk space)

看来MySQL在修复表的时候会用到tmp目录,而这个目录刚好爆满了(见前文截图)。于是tmp的问题解决后,重新修复数据表,这时候速度快了很多,大约几分钟就完成了。

注:使用MySQL的时候,表引擎要选择Innodb,不要选MyISAM,因为MyISAM崩溃后无法安全恢复,因此才导致上面数据表损坏的情况出现。