最近线上一台ubuntu服务器磁盘空间爆满了,扩容完毕后,发现在命令行界面敲tab键补全命令的时候,Linux会提示:
cannot create temp file for here-document: No space left on device
使用df -h
命令查看磁盘使用情况,发现多了一个overflow
的文件系统,挂载目录是/tmp
,而这个目录只有1MB,使用率100%。
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崩溃后无法安全恢复,因此才导致上面数据表损坏的情况出现。