mysql主从复制因“too many open files”中断,本质是系统文件句柄耗尽导致io/sql线程崩溃;须先验证进程实际打开数与限制值,再永久修改systemd的limitnofile并重启服务,同时确认relay_log_purge=on、避免relay log堆积加剧句柄压力。

MySQL主从复制因 too many open files 报错中断
从库复制线程突然挂掉,Last_IO_Error 或 Last_SQL_Error 显示类似 Too many open files、Can't create thread (errno: 24)、Unable to open file /var/lib/mysql/mysql-relay-bin.000012,基本就是操作系统级文件句柄耗尽。这不是 MySQL 配置问题,而是 Linux 内核限制压垮了复制链路。
- MySQL 启动时会打开大量文件:binlog、relay log、表文件、socket、临时文件等;IO 线程持续轮询、SQL 线程重放中继日志时频繁读写,句柄消耗远高于普通查询
-
mysqld进程的 ulimit -n 值通常继承自 systemd 或 shell 启动环境,默认常为 1024,而生产从库实际需要 65536 甚至更高 - 错误不总在
SHOW SLAVE STATUS\G中直接体现——可能表现为Slave_IO_Running: No且Last_IO_Error是空或只显示 “error connecting to master”,此时必须查 MySQL 错误日志才能看到底层Too many open files
确认句柄是否真的耗尽
别猜,先验证:
- 进从库服务器,查 MySQL 进程 PID:
ps aux | grep mysqld,找到主进程 PID(如12345) - 查该进程当前打开句柄数:
ls -l /proc/12345/fd | wc -l,若接近或等于ulimit -n输出值(比如 1024),就坐实了 - 查 MySQL 实际生效的限制:
cat /proc/12345/limits | grep "Max open files",注意Soft Limit和Hard Limit两列 - 查错误日志真实报错:
mysql> SHOW VARIABLES LIKE 'log_error';,然后tail -n 20 /path/to/error.log,搜open files或errno 24
永久修复 ulimit 限制(systemd 环境)
临时改 ulimit -n 65536 没用——MySQL 服务重启后失效。必须改 systemd service 配置:
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 编辑 MySQL service 文件:
sudo systemctl edit mysqld(或mysql,依实际服务名而定) - 填入以下内容:
[Service] LimitNOFILE=65536 LimitNPROC=65536
- 重载配置:
sudo systemctl daemon-reload - 重启 MySQL:
sudo systemctl restart mysqld - 验证生效:
cat /proc/$(pgrep mysqld)/limits | grep "Max open files",应显示65536
注意:不要改 /etc/security/limits.conf,systemd 会忽略它;也不要改 my.cnf 里的 open_files_limit,那只是 MySQL 自身软性建议,不突破系统限制。
避免 relay log 文件爆炸式增长加重句柄压力
句柄不够,relay log 轮转失败会雪上加霜——每个 mysql-relay-bin.xxxxxx 文件都占一个句柄,没及时清理就堆满:
- 确保从库启用了
relay_log_purge = ON(默认就是 ON,但需确认) - 检查
relay_log_space_limit是否设得过小(如 1G),导致频繁轮转产生大量小文件;建议设为 0(不限制)或至少 8G+ - 定期清理旧 relay log:
PURGE RELAY LOGS BEFORE '2026-06-25 00:00:00';(慎用,确保 SQL 线程已执行完对应位置) - 如果从库延迟高,SQL 线程长期卡住,IO 线程还在狂写 relay log,句柄会迅速见顶——这时优先解决卡顿根源(如 1032/1062 错误),而不是只扩句柄
句柄限制不是孤立问题,它常是复制卡死后的症状而非病因。看到 Too many open files,第一反应不该是调大 ulimit,而是立刻 SHOW SLAVE STATUS\G 看 Slave_SQL_Running 是否为 No —— 如果是,先处理数据冲突或 GTID 错位,否则句柄很快又会打满。










