Percona Server 5.7.36-39-log出现errno:24文件打开过多问题求助
排查Percona Server 5.7.36-39-log文件句柄持续增长问题
1. 先确认当前文件句柄限制
- 查看MySQL自身配置的最大文件句柄数:
SHOW VARIABLES LIKE 'open_files_limit'; - 查看MySQL进程实际能使用的系统限制:
cat /proc/$(pidof mysqld)/limits | grep 'Max open files' - 对比当前已打开的文件数:
SHOW GLOBAL STATUS LIKE 'open_files';,确认是否已接近阈值,这是判断问题严重性的基础。
2. 定位MySQL打开的具体文件
用lsof工具精准定位哪些文件在占用句柄:
- 统计总打开数:
lsof -p $(pidof mysqld) | wc -l - 按文件类型分组统计:
重点关注:lsof -p $(pidof mysqld) | awk '{print $NF}' | grep -E '(\.ibd|\.frm|\.log|socket|pipe|#sql-)' | sort | uniq -c- 以
#sql-开头的临时表文件,如果数量持续增长,说明临时表未被自动清理 - InnoDB数据文件(.ibd)是否异常增多,比如分区表未清理、ALTER TABLE遗留的旧表空间
- 二进制日志、中继日志是否堆积,未按配置自动轮转
- 以
3. 检查MySQL核心配置与运行状态
- 临时表相关:
执行SHOW GLOBAL STATUS LIKE 'Created_tmp_%';,如果Created_tmp_disk_tables持续飙升,说明大量临时表落地磁盘。同时检查tmp_table_size和max_heap_table_size是否过小,导致内存临时表频繁转磁盘;另外查看tmpdir目录是否有大量未清理的临时文件。 - 连接与线程:
查看SHOW GLOBAL STATUS LIKE 'Threads_%';,如果Threads_connected持续上升,说明闲置连接未正常释放。检查wait_timeout和interactive_timeout配置,是否设置过长导致连接长期占用句柄。 - InnoDB状态:
执行SHOW ENGINE INNODB STATUS\G,重点看FILE I/O段,是否有大量pending的文件操作,或者Tablespace部分显示未回收的旧表空间;同时检查innodb_open_files配置,若值过小可能导致MySQL重复打开表空间文件,加剧句柄消耗。 - 日志清理:
执行SHOW BINARY LOGS;查看binlog是否堆积,检查expire_logs_days或binlog_expire_logs_seconds是否配置合理;主从架构下,查看SHOW SLAVE STATUS\G的Relay_Log_Space,确认中继日志是否未自动清理。
4. 排查版本相关已知问题
Percona Server 5.7.36-39存在几个可能导致句柄泄漏的场景:
- 某些复杂查询(如带DISTINCT、GROUP BY的子查询)导致磁盘临时表句柄未释放
- MyISAM表在频繁打开/关闭场景下的.frm文件句柄泄漏
- 线程池模式下(若开启
thread_handling=pool-of-threads)的连接句柄泄漏
5. 临时缓解与验证操作
- 执行
FLUSH TABLES;,观察open_files是否下降:若下降,说明是表缓存未及时释放,可调整table_open_cache和table_definition_cache至合理值(建议根据表数量设置,一般为表数的1.5-2倍) - 临时调高文件句柄限制:系统级修改
/etc/security/limits.conf添加mysql soft nofile 65535和mysql hard nofile 65535,MySQL配置文件中设置open_files_limit=65535,重启后观察是否还会快速触达阈值,验证是否为持续性泄漏。
内容的提问来源于stack exchange,提问作者ChrisK
相关产品推荐
相关产品推荐

