MySQL查询排序竟然把磁盘撑爆了
MySQL查询排序竟然把磁盘撑爆了
今天这篇文章主要记录一下今天发现的一个现象,以及如何来解决这个问题。但是引起该问题的根因分析,因为今天太晚了,后期会再跟进补充。
问题描述
查询:SELECT t1.id AS xjob_id, t1.parent_id, t1.order_number,t3.path_name, t1.name AS xjob_name, t1.project_id , t2.id AS relation_id,...错误代码: 126Incorrect key file for table '/tmp/#sql_1_1.MYI'; try to repair it
求助Baidu
/tmp 目录所在的挂载区满了。注:
/tmp 的挂载点在 /验证求助结果
!/bin/bashwhile truedodate '+%F %T.%N'df -hecho ""ls -lrt /tmp/#sql*sleep 0.2secho ""done
1. 首先使用如下语句开启监控:
~: chmod +x ./test.sh~: ./test.sh > ./minitor.log &
2.然后执行SQL
我是用 Webyog SQLyog 工具执行的。用什么工具执行不影响我们的观察结果,这里就不做展示了。
3. 等待SQL执行报错后结束脚本,打开上面monitor.log文件。
/ 的磁盘使用率达到了**100%**,并且 /tmp/#sql_1_1.MYI 文件的大小也在一直增长。等到SQL执行报错后,这个文件会被自动删除,磁盘空间又恢复到了原状。注:这里因为某些原因,就不把 monitor.log 中的信息放出来了。
解决问题
正面硬刚
•尽量将排序的字段不要落到中间表上来解决•通过WHERE子句尽可能多的过滤掉需要排序的数据量
迂回战术
mysql> show variables like '%tmpdir%';+-------------------+-------+| Variable_name | Value |+-------------------+-------+| innodb_tmpdir | || slave_load_tmpdir | /tmp || tmpdir | /tmp |+-------------------+-------+3 rows in set (0.00 sec)
/tmp 目录就是本机MySQL的临时目录配置。/mnt/mysql_tmp1. 命令行配置
mysql> set global tmpdir = '/mnt/mysql_tmp';mysql> set global slave_load_tmpdir = '/mnt/mysql_tmp';
2. 配置文件配置
[mysqld] 的 option 下添加如下配置:tmpdir=/mnt/mysql_tmpslave_load_tmpdir=/mnt/mysql_tmp
service mysql restart3. 云上环境或虚拟机
未完待续
欢迎关注我的公众号“须弥零一”,原创技术文章第一时间推送。
评论
