1.问题
线上的mysql MGR集群突然有一台实例无法连接,检查发现是因为根目录被撑爆,导致OS重启,mysql服务挂了,进一步发现是因为临时表空间放在了根目录,但是这个临时表空间设置最大 innodb_temp_data_file_path = ibtmp1:10G:autoextend 而这个10G已经超过了这个磁盘目录最大存储。
2.MySql临时表空间
MySQL在以下几种情况会创建临时表:
1、UNION查询;
2、用到TEMPTABLE算法或者是UNION查询中的视图;
3、ORDER BY和GROUP BY的子句不一样时;
4、表连接中,ORDER BY的列不是驱动表中的;
5、DISTINCT查询并且加上ORDER BY时;
6、SQL中用到SQL_SMALL_RESULT选项时;
7、FROM中的子查询;
8、子查询或者semi-join时创建的表;
EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using Temporary 就表示会用到临时表。
当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 max-heap-table-size 中取其大者),这时候就需要生成基于磁盘的临时表了。
在以下几种情况下,会创建磁盘临时表:
1、数据表中包含BLOB/TEXT列;
2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);
3、在SELECT、UNION、UNION ALL查询中,存在最大长度超过512的列(对于字符串类型是512个字符,对于二进制类型则是512字节);
如何检查是否使用了临时表空间
explain select 。。。。看下Extra是否有Using temporary
3.解决策略:
1. 修改数据库配置项
2. 重新配置临时文件路径
-
重启数据库服务生效
附:查看mysql集群状态:dba.getCluster().status()查看是否所有节点都是online
您的支持,是我创作的最大动力,敬礼