问题
MySQL 报错:Too many open files 怎么处理?
实验
1. 将问题丢给 ChatDBA
我们先把这个问题丢给 ChatDBA,让他看下具体出了什么问题。
>
左侧为流程分析画布,展示 ChatDBA 对此问题的排查逻辑;右侧为互动区域
2. ChatDBA 协助问题排查
我们将问题输入进 ChatDBA 后,系统反馈先进行信息的收集。
这里 ChatDBA 要求输入一些系统的基本情况,因为该报错很有可能是由于文件描述符数量引起的,要求输入的信息分别为:
- open_files_limit
- ulimit -n
- Innodb open files
open_files_limit
ulimit -n
innodb_open_files
这时,ChatDBA 发现这些配置基本上满足需求,所以要求输入文件打开的数量、临时表情况等,所以接下来就将当时系统的监控图片上传到 ChatDBA。
监控图片
首先,ChatDBA 准确的识别出了监控图像的内容,同时也猜测虽然参数配置的合理,但是临时文件过多是导致该问题的主要原因,通过查看监控也发现,确实临时文件在报错期间增长很快。
ChatDBA 接下来推测是慢查询导致的临时文件过多,所以要求我们输入对应的慢查语句。
接下来我们将对应的 SQL 语句给到 ChatDBA,这时他根据经验推测了一个原因是由于该语句未充分利用到索引,所以让我们给出对应的执行计划。
3. ChatDBA 给出解决方案
我们将 EXPLAIN 的结果截图给到 ChatDBA 后,发现其根据截图内容推测出了问题关键,并且给到了对应的解决方案。
4. 实验总结
这个案例比较有趣,一般情况下 Too many open files
报错和文件描述符配置不当有关。但是该案例中,是由于数据表没有有效的利用到索引导致,后续观察表结构发现,JOIN 关联条件中等号左右两个字段的数据类型不同,一个是 VARCHAR 类型一个是 INT 类型,所以导致该条 SQL 语句没法用到索引,进而创建了非常多的临时文件,所以导致了报错。
问问 ChatGPT-4o
我们也将相同的问题送给了 ChatGPT-4o,让我们看看效果如何。
我们也将相同的问题输入到了 ChatGPT 中,发现其在第一步也发现是文件描述符的问题,但是当我们给到其具体参数后后续的操作步骤没有办法收集或定位到更多有效的信息。