首页 > 问答 > 关键词  > mysql最新资讯  > 正文

MYSQL的ibtmp1文件太大怎么处理

2020-07-14 14:46 · 稿源:数据库干货铺

1. 啥情况呀

测试环境机器磁盘空间不足的告警打破了下午的沉寂,一群人开始忙活着删数据。但是,不久前刚清理了一波数据,测试环境在没做压测的情况下不至于短短一个月不到就涨了200G数据,于是,我悄悄的进入数据目录下,发现一个不寻常的点,ibtmp1 文件有192G

ll-hibtmp1
-rw-r-----1mysqlmysql192GAug1216:20ibtmp1

2. 怎么处理

2.1 简单说明

ibtmp1 是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在支持大文件的系统这个文件大小是可以无限增长的。

2.2 解决办法

a) 找个空闲时间关闭数据

#设置innodb_fast_shutdown参数SETGLOBALinnodb_fast_shutdown=0;#此步骤可以省略
#关闭数据库实例shutdown;#因本实例为MySQL5.7可以直接在SQL命令行中shutdown关闭

关闭后ibtmp1 文件会自动清理

b) 修改my.cnf配置文件

为了避免ibtmp1 文件无止境的暴涨导致再次出现此情况,可以修改参数,限制其文件最大尺寸。

如果文件大小达到上限时,需要生成临时表的SQL无法被执行(一般这种SQL效率也比较低,可借此机会进行优化)

innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:5G#12M代表文件初始大小,5G代表最大size

c) 启动mysql服务

启动数据库后可以查一下是否生效

mysql>showvariableslike'innodb_temp_data_file_path';+----------------------------+-------------------------------+|Variable_name|Value|+----------------------------+-------------------------------+|innodb_temp_data_file_path|ibtmp1:12M:autoextend:max:5G|+----------------------------+-------------------------------+1rowinset(0.01sec)

3. 什么情况下会用到临时表

当EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using Temporary 就表示会用到临时表,例如如下几种常见的情况通常就会用到:

a) GROUP BY 无索引字段或GROUP BY+ ORDER BY 的子句字段不一样时

/**先看一下表结构*/mysql>showcreatetabletest_tmp1\G***************************1.row***************************
Table:test_tmp1CreateTable:CREATETABLE`test_tmp1`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(50)DEFAULTNULL,
`col2`varchar(25)DEFAULTNULL,PRIMARYKEY(`id`),KEY`name`(`name`)
)ENGINE=InnoDBAUTO_INCREMENT=16DEFAULTCHARSET=utf81rowinset(0.00sec)/**groupby无索引字段*/mysql>explainselect*fromtest_tmp1groupbycol2;+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+|1|SIMPLE|test_tmp1|NULL|ALL|NULL|NULL|NULL|NULL|8|100.00|Usingtemporary;Usingfilesort|+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+/**groupby与orderby字段不一致时,及时groupby和orderby字段有索引也会使用*/mysql>explainselectnamefromtest_tmp1groupbynameorderbyiddesc;+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+|1|SIMPLE|test_tmp1|NULL|range|name|name|153|NULL|3|100.00|Usingindexforgroup-by;Usingtemporary;Usingfilesort|+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+1rowinset,1warning(0.02sec)

b) order by 与distinct 共用,其中distinct与order by里的字段不一致(主键字段除外)

/**例子中有无索引时会存在,如果2个字段都有索引会如何*/mysql>altertabletest_tmp1addkeycol2(col2);
QueryOK,0rowsaffected(1.07sec)
Records:0Duplicates:0Warnings:0/**结果如下,其实该写法与groupby+orderby一样*/mysql>explainselectdistinctcol2fromtest_tmp1orderbyname;+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------+|1|SIMPLE|test_tmp1|NULL|index|col2|col2|78|NULL|8|100.00|Usingtemporary;Usingfilesort|+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------+1rowinset,1warning(0.00sec)

c) UNION查询(MySQL5. 7 后union all已不使用临时表)

/**先测一下unionall的情况*/mysql>explainselectnamefromtest_tmp1unionallselectnamefromtest_tmp1whereid<10;+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+|1|PRIMARY|test_tmp1|NULL|index|NULL|name|153|NULL|8|100.00|Usingindex||2|UNION|test_tmp1|NULL|range|PRIMARY|PRIMARY|4|NULL|8|100.00|Usingwhere|+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+2rowsinset,1warning(0.01sec)/**再看一下union作为对比,发现出现了使用临时表的情况*/mysql>explainselectnamefromtest_tmp1unionselectnamefromtest_tmp1whereid<10;+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+|1|PRIMARY|test_tmp1|NULL|index|NULL|name|153|NULL|8|100.00|Usingindex||2|UNION|test_tmp1|NULL|range|PRIMARY|PRIMARY|4|NULL|8|100.00|Usingwhere||NULL|UNIONRESULT|<union1,2>|NULL|ALL|NULL|NULL|NULL|NULL|NULL|NULL|Usingtemporary|+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+3rowsinset,1warning(0.00sec)

d) insert into select ...from ...

/**简单看一下本表的数据重复插入的情况*/mysql>explaininsertintotest_tmp1(name,col2)selectname,col2fromtest_tmp1;+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-----------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-----------------+|1|INSERT|test_tmp1|NULL|ALL|NULL|NULL|NULL|NULL|NULL|NULL|NULL||1|SIMPLE|test_tmp1|NULL|ALL|NULL|NULL|NULL|NULL|8|100.00|Usingtemporary|+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-----------------+2rowsinset(0.00sec)

小结: 上面列举的是最常见的使用临时表的情况,其中基本都是引起慢查询的因素,因此,如果遇到临时表空间文件暴涨是需要查看一下是否有大量的慢查询。

4. 和临时表空间相关的参数有哪些

各参数之间相互影响,其中直接影响临时表空间的参数如要有如下几个

innodb_temp_data_file_path
tmp_table_size
max_heap_table_size
default_tmp_storage_engine
internal_tmp_disk_storage_engine

5. 下面来模拟一个ibtmp1 文件快速膨胀的例子

5.1 调整参数值

上面列出了主要的参数,那么先调整一下参数,以便于模拟

tmp_table_size=16M
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:5G

调整后重启数据库

5.2 造一批数据

/**造一张表或者从其他表复制一批数据,为了方便模拟,可以不创建主键及索引*/mysql>createtabletest_tmp3select*fromdb1.tbname;
QueryOK,15948372rowsaffected(2min27.24sec)
Records:15948372Duplicates:0Warnings:0

此时查看一下ibtmp1 文件的大小

ll-hibtmp1
-rw-r-----1mysqlmysql12MAug1516:06ibtmp1/**此时是默认的初始大小*/

5.2 使用insert into ... select * from ...的方式插入

/**此方式将会使用临时表空间,且tmp_table_size参数已调小为16M,本表当前有2G多,所以会使用临时表空间*/mysql>insertintotest_tmp3select*fromtest_tmp3;
QueryOK,15948372rowsaffected(2min7.40sec)
Records:15948372Duplicates:0Warnings:0

此时 查看一下ibtmp1 文件的大小

ll-hibtmp1
-rw-r-----1mysqlmysql2.8GAug1516:17ibtmp1/**此时已使用了2.8G*/

此时该表的size如下

ll-hbak_db/test_tmp3*/**结果中已有5.8G*/-rw-r-----1mysqlmysql8.9KAug1516:04bak_db/test_tmp3.frm-rw-r-----1mysqlmysql5.8GAug1516:16bak_db/test_tmp3.ibd

5.3 继续测试,看看会发生什么

因为ibtmp1 当前设置的最大值为5G,继续复制一个5.8G的数据,会不会异常,如果异常有什么表现?

/**继续插入时因临时表空间大小有限制,超过5G后将异常,信息如下*/mysql>insertintotest_tmp3select*fromtest_tmp3;
ERROR1114(HY000):Thetable'/app/data/mysql3306/tmp/#sql_32469_0'isfull

此时 查看一下ibtmp1 文件的大小

ll-hibtmp1
-rw-r-----1mysqlmysql5.0GAug1516:17ibtmp1/**此时已使用了5.0G,已达到上限*/

数据库日志里也会记录本次异常

2019-08-15T08:23:47.016495Z3[ERROR]/usr/local/mysql5.7/bin/mysqld:Thetable'/app/data/mysql3306/tmp/#sql_32469_0'isfull

以上测试实例因不同的版本可能会有差异,建议大家亲自测试一下。

本文转载自微信公众号【数据库干货铺】。

举报

  • 相关推荐
  • 忆联 Docker+MySQL 流控方案:打造安全高效存储底座,释放 AI 极致性能

    文章探讨了在AI时代背景下,基于Docker部署MySQL数据库的高效解决方案。通过Docker容器化技术,MySQL实现了灵活部署、资源高效利用和稳定隔离性,成为AI应用的首选数据库方案。测试结果显示,采用PCIe5.0企业级SSD配合Namespace技术和QoS优化策略,能精准控制性能偏差在2%以内,在混合读写场景下更可控制在1%以内。该方案显著提升了存储资源管理效率,为AI应用提供稳定可靠的数据存储支持,同时降低企业TCO成本,推动数据价值释放。

  • 微星发布AMD首款纯白ITX主板MPG B850I EDGE TI WIFI刀锋 钛

    微星推出全新MPG B850I EDGE TI WIFI刀锋钛主板,采用ITX规格设计,支持AMD锐龙9000系列处理器和AM5平台。主板配备10层服务器级PCB,提供稳定供电和超频性能。搭载5G有线网口和满血版WIFI7技术,实现低延迟高速传输。采用三层散热装甲设计,包括扩展型VRM散热片、M.2冰霜铠甲和主动散热风扇,确保高性能硬件稳定运行。主板首发售价1799元,提供3年质保+1年上门服务。

  • 探索AI时代出海新范式!impact.com荣获TopDigital创新营销奖「年度营销技术公司」

    2025年7月1日,impact.com在第十三届TopDigital创新营销盛典上荣获"年度营销技术公司"大奖。该平台凭借技术能力、商业影响和全球化战略的综合表现获得认可,其AI技术正深刻改变品牌营销工作方式,尤其在效率提升与流程优化方面成效显著。impact.com通过智能推荐、智能审批等功能,将AI能力引入合作伙伴管理核心环节,帮助出海企业构建全球化合作网络。大中华区总裁Jennifer Zhang表示,AI不是替代营销人,而是释放其判断力与创造力。作为全球合作伙伴经济核心引擎,impact.com已服务众多中国出海品牌,未来将继续深化AI在营销管理平台的应用。

  • 极光旗下EngageLab及GPTBots双品牌通过SOC 2 Type II认证

    极光旗下EngageLab和GPTBots双品牌通过SOC 2 Type II认证,彰显数据安全与国际合规能力。该认证由美国注册会计师协会制定,覆盖安全性、可用性等五大维度,验证了平台在连续数月的稳定运营表现。作为中国领先的客户互动与营销科技服务商,极光通过旗下客户互动平台EngageLab和企业级AI智能体GPTBots,为全球客户提供行业领先的数据安全保障。此次认证巩固了极光在智能客户互动与AI服务领域的行业地位,其客户覆盖科技、金融等多个领域,遍布全球多个国家和地区。

  • 苹果WWDC25今晚开幕!郭明錤泼冷水:AI别抱太大期待

    今晚,备受关注的苹果全球开发者大会(WWDC)终于来了。 苹果第36届WWDC将于北京时间6月10日至14日举行,主题演讲将6月10日凌晨1点举办,届时,新一代iOS、iPadOS、macOS、tvOS、watchOS、visionOS操作系统将正式发布。 WWDC25开幕前夕,天风国际分析师郭明錤今日发表对大会的3个观察重点,聚焦苹果的AI策略,具体如下: 1、苹果的AI策略是焦点,其他如界面设计改变、操作系统功能�

  • A柱、B柱更强了!雷军:小米YU7通过热气胀工艺嵌入6根2200MPa小米超强钢

    今天上午,雷军发微博又透露了小米YU7在车身被动安全上的一个卖点。他表示,小米YU7借鉴防滚架的设计灵感,在A、B柱内部嵌入6 根2200MPa小米超强钢热气胀管,与车身结构紧密配合,构建起独特的 内嵌式防滚架”。 他介绍,这个设计大幅提升了A柱、B 柱的承载能力,使得车辆在应对翻滚、小偏置正碰以及追尾卡车等极端碰撞场景时,为乘员舱提供更可靠的支撑与保护。

  • 买新款MPV车型别纠结了,上汽大通G50一台顶多用,值!

    文章介绍了上汽大通G50这款MPV车型的实用性和多功能性。该车不仅满足日常通勤需求,还能兼顾家庭出行、商务接待等多种场景。G50拥有4825mm车身长度,2+2+3七座布局灵活实用,第二排独立座椅舒适度高,第三排空间充足。搭载1.5T发动机,动力充沛且油耗仅7.9L/100km。全车配备44处储物空间,后备箱容积大,安全配置齐全。6.98万元起的亲民价格,使其成为家庭用户和创业者的理想选择。

  • “速洗”成行业槽点!海尔云溪洗衣机凭此成TOP1

    海尔云溪洗衣机通过AI直驱技术解决了夏季洗衣痛点:传统速洗模式常洗不净,而云溪4.0系列在15分钟速洗模式下能彻底清除81种常见污渍,洗净率提升30%。其AI智能控制系统可实现每秒16000次精准调节,针对不同面料提供定制洗涤方案,如90°摇篮洗呵护真丝、150°翻转洗保护冲锋衣防水层。该系列产品已主导制定行业AI直驱技术标准,并达到最高健康洁净等级,成为618热销双榜冠军。从机械转动到智能感知的技术革新,让夏季洗衣从耗时工程变为15分钟高效体验。

  • mpv车型大全大通G50 MAX就是为中国家庭量身打造的那一款!

    上汽大通MAXUS G50 MAX是一款全能家用MPV,兼顾空间、舒适与性价比。4825mm车长+2800mm轴距带来宽敞三排空间,2+2+3布局让进出更方便。搭载1.5T+7DCT动力组合,兼顾驾驶乐趣与燃油经济性。配备双12.3英寸大屏、智能语音、分区空调等实用配置,全车46处储物空间满足家庭需求。安全方面采用高刚性车身+多气囊设计,标配倒车影像、雷达等。现优惠后10.48万起,是家用MPV的高性价比之选。

  • OPPO首款内置风扇手机!OPPO K13 Turbo Pro全配置揭晓

    快科技6月14日消息,博主数码闲聊站今天曝光了OPPO K13 Turbo Pro的基础配置信息,这是OPPO的第一款内置风扇手机。具体来看,该机将搭载一块6.8英寸的1.5K直屏,拥有2800*1280p分辨率、144Hz超高刷新率,配备短焦屏幕指纹识别。前摄是1600万像素,后摄是5000万像素 200万像素的双摄组合,影像并不是主打方向。机身采用塑料中框方案,自带RGB灯,支持IPX8。最关键的是性能规格,OPPO K13 Turbo Pro搭载第四代骁龙8s处理器,并且配备有16GB 512GB的大内存组合,是一台主打性能体验的机型。而且该机采用了内置主动风扇散热系统,在后置主摄下