月末时维护的几个项目出现了突发的数据库磁盘容量不足告警。因为用的是AWS RDS for MySQL,当时先快速进行扩容。后面仔细排查才发现,罪魁祸首竟然是定时任务跑报表的复杂查询引起的。
        我们的潜意识里,数据库对磁盘的消耗肯定是以INSERT、UPDATE等为首的相关DML引起的。这属于常规的显性的情况。与此同时,在执行一些复杂SELECT性质(包含需要进行查询的DML)的查询时,MySQL会将中间结果集缓存到一张张临时表中。
        这些临时表原始是内存临时表(in-memory temporary table),当其大小超过一定阈值(tmp_table_size和max_heap_table_size二者中的较小者)后,MySQL会直接将其转存为磁盘实体表(on-disk table),这就是由查询产生的潜在的磁盘消耗的内部机制。
        转换为磁盘实体表的临时表会保存到MySQL数据目录的ibtmp1表空间文件,该文件于5.7版本的默认配置(innodb_temp_data_file_path)为12M:autoextend,即初始大小12M但可自动扩展。在高并发的场景及非常复杂的查询产生大数据量的临时表时,ibtmp1会急剧增大。当一个查询结束后其生成的on-disk temporary table表空间会被马上回收并标记为可再用,下一个查询需要生成on-disk temporary table时可继续复用这块已分配的存储空间。然而,问题在于处于active的MySQL并不会释放已经分配好的ibtmp1空间,即ibtmp1只会增加不能减少。要回收ibtmp1磁盘空间,只能重启MySQL实例以初始化一个新的ibtmp1文件。这就是由查询引发的MySQL磁盘被吞噬的状况。

/* ibtmp utilization */
mysql> SELECT-> f.`FILE_NAME`,-> f.`TABLESPACE_NAME`,-> ROUND(f.`EXTENT_SIZE` * f.`TOTAL_EXTENTS` / 1024 / 1024, 0) AS `DATA_ALLOCATED(MB)`,-> ROUND(f.`DATA_FREE` / 1024 / 1024, 0) AS `DATA_FREE(MB)`-> FROM-> `information_schema`.`FILES` AS f-> WHERE-> f.`TABLESPACE_NAME` = 'innodb_temporary'-> ;
+-----------+------------------+--------------------+---------------+
| FILE_NAME | TABLESPACE_NAME  | DATA_ALLOCATED(MB) | DATA_FREE(MB) |
+-----------+------------------+--------------------+---------------+
| ./ibtmp1  | innodb_temporary |                 12 |             6 |
+-----------+------------------+--------------------+---------------+
1 row in set (0.00 sec)mysql> system ls -lh /usr/local/mysql/data/ibtmp1
-rw-r----- 1 mysql mysql 12M ***  * 10:24 /usr/local/mysql/data/ibtmp1

这个问题在5.7版本还是非常需要留意的,执行一些成百上千行的BI大查询SQL时,如果本身实例的磁盘已经不是很充足,潜在地会引发ibtmp1表空间急速增长产生磁盘空间不足告警。于是,在8.0版本MySQL引入了TempTable内存临时表引擎和session temporary tablespace,ibtmp1被直接移除了。

参考:

https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html

https://www.percona.com/blog/2019/07/17/mysql-disk-space-exhaustion-for-implicit-temporary-tables/
https://aws.amazon.com/premiumsupport/knowledge-center/view-storage-rds-mysql-mariadb/

MySQL隐形的磁盘吞食兽——生成临时表的查询相关推荐

  1. mysql 临时表联表查询_Mysql应用MySQL使用临时表加速查询的方法

    <MysqL应用MysqL使用临时表加速查询的方法>要点: 本文介绍了MysqL应用MysqL使用临时表加速查询的方法,希望对您有用.如果有疑问,可以联系我们. 本文实例讲述了MysqL使 ...

  2. asp.net mysql 创建变_[ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...

    [ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型 0 2018-06-30 07:00:08 官方教程: ...

  3. excel使用MySQL数据,如何使用mysql完成excel中的数据生成

    Excel是数据分析中最常用的工具,本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成,数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透 ...

  4. mysql 磁盘限额_Linux运维知识之为Linux MySQL数据库设置磁盘限额

    本文主要向大家介绍了Linux运维知识之为Linux MySQL数据库设置磁盘限额,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 因为MySQL数据库本身没有磁盘限额的功能,我 ...

  5. mysql磁盘io高是什么造成_FAQ | 是什么导致MySQL数据库服务器磁盘I/O高(本文章来自知数堂)...

    0.导读 有个MySQL服务器的磁盘I/O总有过高报警,怎么回事? 本文约1500字,阅读时间约10分钟. 1.问题 我的朋友小明,TA有个MySQL服务器最近总是报告磁盘I/O非常高,想着我这有免费 ...

  6. linux mysql 磁盘_Linux运维知识之为Linux MySQL数据库设置磁盘限额

    本文主要向大家介绍了Linux运维知识之为Linux MySQL数据库设置磁盘限额,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 因为MySQL数据库本身没有磁盘限额的功能,我 ...

  7. 在线MySQL,SQL Server建表语句生成JSON测试数据工具

    在线MySQL,SQL Server建表语句生成JSON测试数据工具 在线MySQL,SQL Server建表语句生成JSON测试数据工具 本工具可以将SQL建表语句生成JSON测试数据,支持MySQ ...

  8. mysql序列表,自增序列生成合同编号

    项目中使用mysql数据库,需要使用自增序列号生成合同编号,编号按年份每年更新,且根据合同模板不同需使用多个自增序列.为了考虑拓展性,也方便其他业务使用序列,使用了序列表进行集中管理,使用函数操作序列 ...

  9. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

最新文章

  1. android 跳转到应用市场
  2. mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
  3. javassist学习笔记
  4. 基于python的快速傅里叶变换FFT(一)
  5. shell之a+b求和l脚本的三种写法
  6. matlab排版形式是什么样子,工作型PPT,图文排版的4种常见样式
  7. 逆置/反转单链表(C语言)
  8. 输入一个字符串,删除汉字字符或者西文字符(C语言)
  9. php去除img,PHP如何去除IMG标签?_后端开发
  10. 【优化算法】世界杯优化算法(WCOA)【含Matlab源码 1427期】
  11. 如何搜索视频和字幕?
  12. 工业机器人市场2018年热点回顾与2019年展望
  13. 玩~成语接龙c++代码
  14. 数据结构:单链表——带头结点与不带头结点步骤详解
  15. 给 Java 初学者的学习路线建议
  16. Web前端开发 icon图标 转 web字体图标
  17. SpringBoot四大核心
  18. scConverter 文档转换 DLL / SDK
  19. React - review 2
  20. 在WPF中加载gif动态图片

热门文章

  1. Cvbox2D 角度 长宽正解
  2. 英伟达史上最大手笔!70亿美元拟收购Mellanox,全球芯片整合大潮拍岸
  3. GameFramework使用教程
  4. Python set 的pop()方法 返回元素并不随机
  5. JS 写的5秒钟倒计时跳转
  6. 基于轨迹数据的人口流向分析技术,精准病毒传播追踪
  7. php 匹配反斜杠,正则表达式匹配反斜杠的方法
  8. 输入一个日期,计算出这个日期是这一年的第多少天。
  9. Android入门(二)——常见布局与控件
  10. 手机图片编辑软件哪个好?实用教程来啦