浅析mysql报错:Error writing file '/tmp/MY4QWdUa' (Errcode: 28 - No space left on device) 磁盘空间不足的问题和解决思路
一、问题背景
1、报错描述:
今天执行 sql 时发现 Node 服务的日志报错:SequelizeDatabaseError: EE_WRITE: Error writing file '/tmp/MY4QWdUa' (Errcode: 28 - No space left on device)
2、错误原因:
这种情况就是 mysql 在关联大表的时候,需要的存储空间大于当前服务器的剩余磁盘空间
这个问题应该是因为错误提示中提示的临时目录的空间不足导致的。
这个错误如果想看到它的现象,就必须在sql运行时来监视这个临时文件夹的大小,就可以看到mysql在/tmp下创建了一个临时文件,这个临时文件的大小取决于sql语句以及表的大小。
什么场景呢?比如:我表中现有大概29万行数据,大概有30列,使用insert into m (...) select ...from mp where contentLen < 3145729 group by concat(...)时,mysql会在临时目录下创建了一个大概将近6G的临时文件,我磁盘只剩了5G,所以导致了mysql报写文件错误。
3、解决方案:
要么清理一下,要么换个空间大点的存储位置。
二、解决思路
当执行查询 sql 的时候,查询数据量比较大,后台报了SQLException , mysql 临时写入磁盘不足问题,就是上面的问题。那么该如何分析呢?
1、首先:查看服务器磁盘使用情况
命令:df -lh
找到挂载点为根目录(/)的文件系统空间占用情况:
注 :查看磁盘分配大小及使用情况 查看情况如下: 当时看到已使用的 (used:48G use% 100% )
2、然后 cd 到根路径,使用 du -sh * ,命令查看文件使用情况
比如我这里看到 var 是 16G,那就再进入var文件夹查看再次执行 du -sh * 命令,查看占用磁盘比较大的文件。以此类推
看网上有说:我的是在 “/var/lib/mysql#” 文件下,有个文件占了22G,果断 rm -f +文件名字 命令删除此文件
再次执行 df -h命令 查看磁盘情况 什么变化也没有!!!! 磁盘使用还是100% 37G
回到服务器根路径下 执行 du -sh 确实磁盘空间使用大小只有16G在网上查了一下原因 ,这是因为我们在删除的时候 rm -f 只是将文件的链接解除,如果此时有进程打开文件,系统是不会回收文件。
网上找了两个解决办法:
1、重启云服务器,让服务器自动释放已删除的资源2、lsof | grep deleted 命令,查看已删除文件pid,然后kill掉,再次查看 df -h 命令就释放掉了
找到刚才删除的文件 ,看一下它的pid 然后执行 kill -9 +pid 就好了
3、查看根目录中哪个文件夹/文件占用高:cd ~ (上面是切到根目录,这个切到 home 目录看文件占用情况)
切换到 home 目录:cd ~,再输入命令du -h -x --max-depth=1
,其中 --max-depth=1 表示目录深度只显示第一层,否则显示层级太多不方便查看
(之前下面这个 .pm2 占用 10g)
4、我的原因是:用 pm2 部署的,logs 日志有个日志特别大,删除就好了
pm2 默认的日志目录:
[root@VM_0_8_centos logs]# pwd
/root/.pm2/logs
同理也可以删除其他占用高的目录中的无用文件。