Ubuntu系统MySQL执行复杂查询报No Space Left On Device错误求助
解决MySQL执行复杂查询时提示"No space left on device"但磁盘有剩余空间的问题
我之前帮同事排查过一模一样的问题,你遇到的这个报错看起来是MySQL临时文件目录的配置或者分区空间的「隐性问题」,下面一步步给你拆解排查和解决方法:
先确认错误里的临时文件目录实际空间
报错里的临时文件路径是/mnt/disk/tmp/MY0Wy7vA,你说磁盘有11G空闲,但一定要单独检查这个目录所在分区的空间,而不是只看整个磁盘的总空间:
- 执行命令:
df -h /mnt/disk/tmp/
这个命令会直接显示/mnt/disk/tmp/所在分区的使用情况——很多时候用户误以为磁盘总空间够,但tmp所在的是一个单独的小分区(比如当初挂载时只给了tmp分区几个G),早就被占满了。
检查MySQL的临时目录配置
如果上面的分区确实有足够空间,那就要看MySQL是不是真的在使用你以为的磁盘:
- 登录MySQL:
mysql -u root -p - 执行查询:
SHOW VARIABLES LIKE 'tmpdir';
看看返回的结果是不是/mnt/disk/tmp/。如果是的话,可能存在两种情况:- 这个目录里有隐藏的大文件没被统计,用
du -sh /mnt/disk/tmp/看看目录总大小; - 复杂排序/分组查询需要生成超大临时文件,瞬间占满了分区剩余空间,报错后临时文件被自动删除,所以你监控
df时没看到空间变化。
- 这个目录里有隐藏的大文件没被统计,用
解决方法:更换MySQL的临时文件目录
如果确认当前tmpdir所在分区空间不够,直接把临时目录换到有足够空间的位置:
- 找一个有充足空闲的目录,比如
/home/mysql_tmp,先创建它:sudo mkdir /home/mysql_tmp - 修改权限,让mysql用户能读写:
sudo chown mysql:mysql /home/mysql_tmp && sudo chmod 700 /home/mysql_tmp - 编辑MySQL的配置文件,比如
/etc/mysql/mysql.conf.d/mysqld.cnf(不同Ubuntu版本路径可能略有不同,找不到的话可以用find /etc/mysql -name "*.cnf"查找),找到tmpdir这一行,改成:tmpdir = /home/mysql_tmp - 重启MySQL服务:
sudo systemctl restart mysql
额外排查点:磁盘配额
如果上面的方法都没用,检查下是不是mysql用户被设置了磁盘配额:
- 先安装quota工具:
sudo apt install quota - 执行
repquota -a,看看mysql用户的磁盘使用是不是被限制了,导致无法写入大的临时文件。
内容的提问来源于stack exchange,提问作者Ahmedn1
相关产品推荐
相关产品推荐

