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,...
错误代码: 126
Incorrect key file for table '/tmp/#sql_1_1.MYI'; try to repair it
求助Baidu
/tmp
目录所在的挂载区满了。
注:
/tmp
的挂载点在 /
验证求助结果
!/bin/bash
while true
do
date '+%F %T.%N'
df -h
echo ""
ls -lrt /tmp/#sql*
sleep 0.2s
echo ""
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_tmp
1. 命令行配置
mysql> set global tmpdir = '/mnt/mysql_tmp';
mysql> set global slave_load_tmpdir = '/mnt/mysql_tmp';
2. 配置文件配置
[mysqld]
的 option 下添加如下配置:
tmpdir=/mnt/mysql_tmp
slave_load_tmpdir=/mnt/mysql_tmp
service mysql restart