Mysql临时表突增问题定位与分析
一、问题现象 数据展示系统出现异常,首页刷不出数据,查看日志后发现模块无法连接数据库(从库,以下数据库都表示从库),紧接着数据分析模块出现报警,服务器出现磁盘空间不足报警。 查看AWS RDS监控发现,在时间段 ‘08.31 19:15:00 - 09.01 01:19:00’ 内,数据库实例存储空间急剧下降 监控显示,数据库连接数量没有明显增加,但在该时间段内磁盘IO明显增大 磁盘IO 数据库连接数量 通过查看实例上磁盘的占用情况,发现磁盘临时表占用了大量空间(420G/500G),于是我们开始定位为何会有大量的临时表被持久化到磁盘上 二、问题分析与复现 2.1 临时表 MySQL中有两种临时表:外部临时表和内部临时表。其中外部临时表可有用户查询时手动创建保存一些中间数据,提升查询效率等; 内部临时表会在查询过程中由Mysql自动创建并存储某些中间操作的结果,这种操作可能出现在优化阶段或者执行阶段,所以这种临时表对用户不可见,一般通过EXPLAIN可以查看查询语句是否用到了内部临时表。 而内部临时表又可以被分为磁盘临时表和内存临时表,Mysql在使用内部临时表时会优先使用内存临时表,即将临时表存放在内存里,当临时表过大或内存不够用时,就会转化成磁盘临时表,存放在ibtmp1文件中。 在Mysql5.7中,内存临时表在查询结束后会被释放,而文件ibtmp1占用的空间不会被自动释放