MySQL:innodb cannot create temporary merge file的问题记录和解决方案

一、问题描述

服务在开发环境上运行正常,但在客户环境上却有个别api接口功能出现MySQL error:time-out问题,总结发现,所有出问题的接口底层都是多表(两个表以上)联合查询SQL。

二、运行环境

2.1 客户提供的Windows系统

2.2 早期团队部署的laragon工具

2.3 早期团队通过laragon安装的mysql(8.0.30版本)

2.4 其他应用

三、问题排查

3.1 既然是多表查询出现的问题,开始以为是客户数据过大,运行内存不足,于是接口调用,看了下运存,还够用,排除因内存不足引起的问题。

在这里插入图片描述

3.2 针对具体的SQL语句,抓出来,在机器上跑了一下,SQL运行正常,数据量并不算大,而且走了sql 索引,排除SQL语句不合理的原因。

在这里插入图片描述

3.3 但通过explain注意到 using temporary;using filesort;想想是不是这里相关引起的问题呢?

  • 通过执行如下命令,查看mysql运行输出日志:
show variables like '%error%';

在这里插入图片描述

  • 打开mysql错误日志,查看具体错误信息;
    在这里插入图片描述
    通过日志信息,可以看出来,问题很清晰了:
  1. 初始化dd 存储引擎失败
  2. 数据目录初始化失败
  3. 无法创建临时表文件

四、解决方案

4.1 针对上述问题,已经有很成熟的解决方案了。

找到MySQL的应用,在 my.ini文件中加临时文件路径,重启MySQL服务即可:

tmpdir="C:/ProgramData/MySQL/MySQL-8/tmp/"

五、总结

问题出现的原因:

  • MySQL应用是之前的PHP团队,通过laragon工具安装的,一些MySQL参数配置并没有进行调整、调优。导致后面做java环境建设和应用部署时,一些不必要的问题出现,这个需要注意下,属于既定环境上的二次建设问题。
  • 对问题的跟踪解决能力,看错误日志,抓问题本质。