浅析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
同理也可以删除其他占用高的目录中的无用文件。
相关文章
- new QDM 前后端开发总结(net6+vue+mysql+redis+mq+mongodb+ES+docker)
- mysql 设置 row格式binlog_为什么要把MySQL的binlog格式修改为row
- linux环境,通过rpm删除mysql包,报错:error reading information on service mysqld: Invalid argument
- 【MySQL】Mysql 日志
- mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
- 应对亿级访问,另辟蹊径实现MySQL主库高可用
- SQL---mysql新增字段
- MySQL查看视图
- MySQL存储过程高级SQL语句总结
- .NET/Mysql-petatoco连接mysql数据库
- 《PHP、MySQL和Apache入门经典(第5版)》一一2.10 Q&A
- 转 mysql spool_用MySQL实现类似Oracle SPOOL的功能
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
- Mysql命令mysql:连接Mysql数据库
- Mysql_mysql 性能分析及explain用法
- Python使用DB-API操作MySQL数据库
- 【3.3】mysql链接服务器,Federated存储引擎实现远程表,相当于sql server的连接服务器
- mysql窗口函数、Mysql分析函数
- java c3p0连接数据库实例(mysql)完整实例
- Go-MySQL-Driver:一个Go语言的轻量级极速的mysql驱动
- MySQL数据库断电修复(Database page corruption on disk or a failed)
- python封装一个工具类 ,对MySQL数据库增删改查,可多字段动态插入mysql数据库中
- mysql建表设置格式