数据库 data 磁盘不足,磁盘占用 80% 以上

数据库 binlog 磁盘不足,磁盘占用 80% 以上

二、排查过程

登陆告警的服务器,查看磁盘空间,并寻找大容量文件后,发现端口号为 4675 的实例临时表空间 ibtmp1 的大小有 955G,导致磁盘被使用了 86%;

猜测和库里执行长 SQL 有关系,产生了很多临时数据,并写入到临时表空间。

看到有这样一条 SQL,继续分析它的执行计划;

很明显看到图中标记的这一点为使用了临时计算,说明临时表空间的快速增长和它有关系。这条 SQL 进行了三表关联,每个表都有几十万行数据,三表关联并没有在 where 条件中设置关联字段,形成了笛卡尔积,所以会产生大量临时数据;而且都是全表扫描,加载的临时数据过多;还涉及到排序产生了临时数据;这几方面导致 ibtmp1 空间快速爆满。

三、解决办法

和项目组沟通后,杀掉这个会话解决问题;

但是这个 SQL 停下来了,临时表空间中的临时数据没有释放;

最后通过重启 mysql 数据库,释放了临时表空间中的临时数据,这个只能通过重启释放。

四、分析原理

通过查看官方文档,官方是这么解释的:

翻译:

根据官网文档的解释,在正常关闭或初始化中止时,将删除临时表空间,并在每次启动服务器时重新创建。重启能够释放空间的原因在于正常关闭数据库,临时表空间就被删除了,重新启动后重新创建,也就是重启引发了临时表空间的重建,重新初始化,所以,重建后的大小为 12M。

从错误日志里可以验证上面的观点:

五、官网对于 ibtmp1 大小的说明

六、如何避免

1. 对临时表空间的大小进行限制,允许自动增长,但最大容量有上限,本例中由于 innodb_temp_data_file_path 设置的自动增长,但未设上限,所以导致 ibtmp1

有 955G。

正确方法配置参数 innodb_temp_data_file_path:

[mysqld]

innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

参考官方文档:

设置了上限的大小,当数据文件达到最大大小时,查询将失败,并显示一条错误消息,表明表已满,查询不能往下执行,避免 ibtmp1 过大。

2. 在发送例如本例中的多表关联 SQL 时应确保有关联字段而且有索引,避免笛卡尔积式的全表扫描,对存在 group by、order by、多表关联的 SQL 要评估临时数据量,对 SQL 进行审核,没有审核不允许上线执行。

3. 在执行前通过 explain 查看执行计划,对 Using temporary 需要格外关注。

七、其他补充

1> 通过字典表查看执行的 SQL 产生临时表、使用临时表空间的情况:

查询字典表:sys.x$statements_with_temp_tables

select * from sys.x$statements_with_temp_tables where query like 'select%' and db='test' order by tmp_tables_to_disk_pct,disk_tmp_tables desc\G;

查询字典表:sys.statements_with_temp_tables

select * from sys.statements_with_temp_tables where query like 'select%' and db='test' order by tmp_tables_to_disk_pct,disk_tmp_tables desc\G;

这两个表查询的结果是一样的,各列含义如下:

query:规范化的语句字符串。

db:语句的默认数据库, NULL 如果没有。

exec_count:语句已执行的总次数。

total_latency:定时出现的语句的总等待时间。

memory_tmp_tables:由该语句的出现创建的内部内存临时表的总数。

disk_tmp_tables:由该语句的出现创建的内部磁盘临时表的总数。

avg_tmp_tables_per_query:每次出现该语句创建的内部临时表的平均数量。

tmp_tables_to_disk_pct:内部内存临时表已转换为磁盘表的百分比。

first_seen:第一次看到该声明的时间。

last_seen:最近一次发表该声明的时间。

digest:语句摘要。

通过字典表 tmp_tables_to_disk_pct 这一列结果可知,内存临时表已转换为磁盘表的比例是 100%,说明通过复现这个查询,它的临时计算结果已经都放到磁盘上了,进一步证明这个查询和临时表空间容量的快速增长有关系。

2> 对于 mysql5.7 中 kill行长 SQL 的会话,ibtmp1 容量却没有收缩问题的调研;

从文章中的解释看,会话被杀掉后,临时表是释放的,只是在 ibtmp1 中打了删除标记,空间并没有还给操作系统,只有重启才可以释放空间。

3> 下面,进一步用 mysql8.0 同样跑一下这个查询,看是否有什么不同;

mysql 版本:8.0.18

当这个 sql 将磁盘跑满之后,发现与 5.7 不同的是这个 SQL 产生的临时数据保存到了 tmpdir,mysql5.7 是保存在 ibtmp1 中,而且由于磁盘满,SQL 执行失败,很快磁盘空间就释放了;

问题:如何使用到 8.0 版本的临时表空间?

通过查看 8.0 的官方文档得知,8.0 的临时表空间分为会话临时表空间和全局临时表空间,会话临时表空间存储用户创建的临时表和当 InnoDB 配置为磁盘内部临时表的存储引擎由优化器创建的内部临时表,当会话断开连接时,其临时表空间将被截断并释放回池中;也就是说,在 8.0 中有一个专门的会话临时表空间,当会话被杀掉后,可以回收磁盘空间;而原来的 ibtmp1 是现在的全局临时表空间,存放的是对用户创建的临时表进行更改的回滚段,在 5.7 中 ibtmp1 存放的是用户创建的临时表和磁盘内部临时表;

也就是在 8.0 和 5.7 中 ibtmp1 的用途发生了变化,5.7 版本临时表的数据存放在 ibtmp1 中,在 8.0 版本中临时表的数据存放在会话临时表空间,如果临时表发生更改,更改的 undo 数据存放在 ibtmp1 中;

实验验证:将之前的查询结果保存成临时表,对应会话是 45 号,通过查看对应字典表,可知 45 号会话使用了 temp_8.ibt 这个表空间,通过把查询保存成临时表,可以用到会话临时表空间,如下图:

下一步杀掉 45 号会话,发现 temp_8.ibt 空间释放了,变为了初始大小,状态为非活动的,证明在 mysql8.0 中可以通过杀掉会话来释放临时表空间。

总结:在 mysql5.7 时,杀掉会话,临时表会释放,但是仅仅是在 ibtmp 文件里标记一下,空间是不会释放回操作系统的。如果要释放空间,需要重启数据库;在 mysql8.0 中可以通过杀掉会话来释放临时表空间。

mysql 临时表空间占用太高_MySQL 临时表空间数据过多的问题排查-爱可生相关推荐

  1. mysql b树子节点个数_MySQL 和 B 树的那些事-爱可生

    原标题:MySQL 和 B 树的那些事-爱可生 在介绍B树之前,先来看另一棵神奇的树--二叉排序树(Binary Sort Tree),首先它是一棵树,"二叉"这个描述已经很明显了 ...

  2. 服务器内存占用太高如何解决及知识点介绍

    背景 服务器内存占用太高 查看内存 free -m 查看服务器内存使用情况,-m的意思是内存显示单位是mb top 查看服务器所有进程占用内存,为了查看方便,可以使用 shift+md可以让进程按照内 ...

  3. 如何占用计算机内存,电脑内存占用太高怎么办 教你电脑内存不够用解决方法...

    现在很多白领买电脑,都会优先考虑电脑的续航和便捷,因为他们买电脑主要也就办办公,看看电影,又不玩大型游戏,所以高性能对他们来说也没什么必要. 笔记本电脑 但现在市面上续航久,便携性比较高的Intel电 ...

  4. oracle临时表空间暴涨,如何解决Oracle临时表空间过大

    方案一:增加临时表空间的大小 1.临时表空间的使用情况题 SELECT D.tablespace_name, SPACE "SUM_SPACE(M)", blocks " ...

  5. MySQL 实例空间使用率过高的原因和解决方法

    MySQL 实例空间使用率过高的原因和解决方法 参考文章: (1)MySQL 实例空间使用率过高的原因和解决方法 (2)https://www.cnblogs.com/drizzle-xu/p/ali ...

  6. 怎么减少计算机内存占有,还在为电脑内存占用太高而烦恼吗?教你一招轻松解决...

    查毒了也不管用.结果是电脑的物理内存占用太高了,下面就教大家怎么减少物理内存,希望对您有所帮助! 1.启动"windows任务管理器",快捷键"alt+ctrl+dele ...

  7. 接口压测时MySql对CPU占用过高

    记录MySql过多占用CPU资源的排查过程及解决方案 场景: 1.需要对项目的接口进行压力测试 2.大部分接口压测是正常的 3.只有部分接口压测时MySql对CPU的占用达到90%   压测: 压测线 ...

  8. 运维:你们 JAVA 服务内存占用太高,还只增不减!告警了,快来接锅

    先点赞再看,养成好习惯 某天,运维老哥突然找我:"你们的某 JAVA 服务内存占用太高,告警了!GC 后也没释放,内存只增不减,是不是内存泄漏了!" 然后我赶紧看了下监控,一切正常 ...

  9. mysql内存占用过高_mysql占用内存过高排查

    排查点:数据库配置,数据分区.定时事件.存储过程 触发原因:java服务莫名的挂掉了 机器信息:centos 7 ,腾讯云服务器1核2G,只安装了mysql和运行一个java服务. 经过排查过程: 查 ...

  10. ORACLE 临时表空间使用率过高的原因及临时解决方案

    数据库temp临时表空间增大,一般在数据安装时设置临时表空间大小,默认的情况下都是设置为自动增长.这样会引起一个问题:在数据库使用中temp表空间会自动扩展的越来越大,造成磁盘空间使用不足. 引起临时 ...

最新文章

  1. 怎么讲服务器上的文件装进电脑,怎么把电脑文件放进云服务器
  2. 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
  3. 积微论坛第一期 - 基于大数据整合预测土壤枯萎病的发生 (文稿分享)
  4. javascript、jquery获取网页的高度和宽度
  5. DSO missing from command line原因及解决办法
  6. java基础知识---IO常用基础操作(一)
  7. bim管线插件:教你平面显示家用冷热水和卫生设备管道
  8. 多重if-else的精简方式
  9. Doxygen、hhc生成chm格式文档
  10. 中兴通讯专利技术价值超450亿元
  11. 锐捷——DCHP动态分配IP地址
  12. ESXi 6 升级到ESXi 6.5VIB冲突问题
  13. 高通625系列-MSM8953 (Cortex-A53架构)
  14. 区分C语言中的*(p++), *p++, (*p)++, *(++p), *++p
  15. php代码数鸡蛋数学题,求鸡蛋数
  16. 【密码学】HMAC与HS256算法
  17. mysql 求平均数 (AVG聚合函数)
  18. VUE DIFF算法之快速DIFF
  19. HP 员工挑战老板的一封信
  20. 无人机PHP3,【无人机摄影-基础篇】大疆精灵3使用最全指南(官方出品)

热门文章

  1. 2022QS世界大学学科排名出炉,计算机学科有哪些信息值得关注?
  2. SAP中销售订单中的条件类型修改控制问题配置分析
  3. MacBook鼠标指针乱窜/不受控制问题的解决方法
  4. php换行快捷输入,excel中换行的快捷键是什么
  5. ValueError: operands could not be broadcast together with shapes、numpy广播错误
  6. STM32精确延迟1us和1ms的函数
  7. 如何使用tcpdump来捕获TCP SYN,ACK和FIN包
  8. SAP库存查询MB52报表如何设置为ALV格式显示?
  9. html 公式编辑器,基于web的在线复杂公式编辑器的实现
  10. DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运