mysql innodb临时表btmp1文件太大

某日生产环境(数据库实例)告警,磁盘使用率过高!

检查发现是由于mysql的data目录的ibtmp1文件太大,达到了30GB

一、ibtmp1文件是干嘛的?

mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-tablespace.html

就是用来存放临时表查询时的数据。

二、ibtmp1增长的原因是什么?

主要与SQL有关,尤其是大量的分组聚合,排序,join查询SQL.

通常如下情况会造成iptmp1上涨:

  1. 查询语句会先查询temp_table_size(内存分配)的量,当临时存储的量超过这个参数限制时,就会在iptmp1中申请占用空间。
  2. select order group by GROUP BY 无索引字段或group by + order by 的子句字段不一样时。
  3. select (select) 子查询
  4. insert into select ... from ... 表数据复制
  5. select union select 联合语句
     

注意:临时表释放后,空间会释放,但是磁盘空间不会释放,空闲空间可以被复用。释放磁盘空间只能重启

 

三、解决办法

1、去检查sql!

通过慢查询日志找到慢sql(包含子查询的sql着重关注),要确保子查询内的结果集不要太大(返回太多行),可以通过子查询的where条件缩减结果集。

或是通过show processlist查询的,如图:

我这里正是因为sql太慢,和子查询的结果集太大,导致了mysql线程卡死。通过优化后,iptmp1文件大小正常了。

2、my.cnf配置临时文件大小限制

[mysqld]
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

不推荐,因为一旦临时文件增长到500M后, 再进行需要临时表的sql查询(例如子查询),是会报错的!

猜你喜欢

转载自blog.csdn.net/sumengnan/article/details/113135843
今日推荐