上云无忧 > 文档中心 > 百度智能云云数据库RDS MySQL5.7ibtmp暴涨导致磁盘打满问题
云数据库 RDS
百度智能云云数据库RDS MySQL5.7ibtmp暴涨导致磁盘打满问题

文档简介:
MySQL从5.7.1版本开始,临时表的存放由之前的临时文件可替换成采用独立的临时表空间形式,命名为ibtmp1;由innodb_temp_data_file_path参数可配置临时表空间相关参数。MySQL将临时表空间从系统表空间 (system tablespace) 文件中独立出来,该共享临时表空间用于存储非压缩 InnoDB 临时表 (non-compressed InnoDB temporary tables)、关系对象 (related objects)、回滚段 (rollback segment) 等数据。 for MySQL 版
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

背景

MySQL从5.7.1版本开始,临时表的存放由之前的临时文件可替换成采用独立的临时表空间形式,命名为ibtmp1;由innodb_temp_data_file_path参数可配置临时表空间相关参数。MySQL将临时表空间从系统表空间 (system tablespace) 文件中独立出来,该共享临时表空间用于存储非压缩 InnoDB 临时表 (non-compressed InnoDB temporary tables)、关系对象 (related objects)、回滚段 (rollback segment) 等数据。

问题现象

某客户的mysql5.7的RDS实例磁盘使用率报警:HOME磁盘剩余空间不足,磁盘使用量已达95%。

原因分析

  • 查看主库用户数据目录下磁盘占比95%,但是备库占比65%,因此判定主库有额外数据占用磁盘;
  • 进一步排查:在主库数据目录下du -sh ./*命令查看文件目录大小,发现ibtmp1临时表空间高达167G;
  • 进而排查发现用户连接中有1000+s的笛卡尔积查询,导致产生了大量的临时数据到临时表空间中。

解决方案

  • 征得用户同意后kill查询语句,防止查询语句继续增大ibtmp1,导致磁盘打满业务不可用。
  • 由于临时表空间扩大后不能自动收缩,因此需要用户重启RDS实例释放临时表空间。

案例复现

测试SQL语句:

[baidu_dba] mysql>select count(*) from tb_1 order by id,c,pad,k;

参数设置:

[baidu_dba]mysql>show variables like 'innodb_temp_data_file_path';
+----------------------------+-----------------------+
| Variable_name              | Value                 |
+----------------------------+-----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
+----------------------------+-----------------------+
1 row in set (0.01 sec)

临时表空间初始化默认12M:

执行较大查询后生成的临时表在临时表空间中,使得表空间变大:

由于RDS实例中默认innodb_data_file_path参数没有设置最大临时表空间大小,因此会造成临时表空间过大导致磁盘打满的现象。

结论建议

  1. MySQL5.7查询语句注意查询的方式是否合理(避免产生笛卡尔积导致临时表不断增大);查询如果需要用到order by等语句导致使用到临时表空间排序,注意控制结果集大小,避免临时表中结果集过大导致临时表空间过大。
  2. 对临时表的总结
  • 对于MySQL 5.6

当开启参数innodb_file_per_table时,临时表在tmpdir指定的目录生产临时表数据文件和表结构文件,元数据存在ibdata1中; 当关闭参数innodb_file_per_table时,临时表在ibdata1中产生临时表数据,并且退出session后ibdata1大小不会缩小。

  • 对于MySQL 5.7

当临时表是非压缩表时,临时表数据存储在ibtmp1临时表空间中,表结构数据放在tmpdir下; 当临时表是压缩表时,临时表数据、结构存储在tmpdir下。

相似文档
  • MySQL的权限REFERENCES是控制是否允许给表建立外键关联关系的权限。 问题现象: 从MySQL5.6版本的数据库中导出的含外键的表,然后再导入到MySQL5.7版本的数据库中,导入过程中产生如下报错: ERROR 1142 (42000): REFERENCES command denied to user 'user'@'host' for table 'tb_01'; for MySQL 版
  • 从MySQL 5.7.5版本开始,可以在线动态调整innodb_buffer_pool_size的大小,这个新特性同时也引入了参数innodb_buffer_pool_chunk_size。因为buffer pool的大小受innodb_buffer_pool_chunk_size和innodb_buffer_pool_instances两个参数影响,所以,实际innodb_buffer_pool_size的大小可能与DBA设置的并不一样,有时区别甚至还挺大。 for MySQL 版
  • MySQL 在 5.7 版本中新增了生成列(Generated Column)的功能,它可以通过函数表达式计算获得新的一列数据,我们可以在函数表达式查询中通过构建生成列加索引的方式提高查询效率、分区表可使用生成列进行分区等,由于生成列默认是虚拟类型,因此通常称之为虚拟列。 for MySQL 版
  • MySQL 在 5.7 版本中新增了生成列(Generated Column)的功能,它可以通过函数表达式计算获得新的一列数据,我们可以在函数表达式查询中通过构建生成列加索引的方式提高查询效率、分区表可使用生成列进行分区等,由于生成列默认是虚拟类型,因此通常称之为虚拟列。 for MySQL 版
  • mysqldump是MySQL自带的客户端工具,它主要用于对MySQL进行逻辑备份,可实现库、表、行级别的数据备份及库表结构备份需求。应用场景包括不限于如下几种情况: 执行DML、DDL类型SQL前进行数据备份(用于回滚需要)。 不同云厂商之间数据库的数据迁移。 数据库版本升级过程中的数据迁移。 导出部分数据到测试环境用于功能和性能测试。 for MySQL 版
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部