如何处理MySQL主从复制中由于操作系统句柄限制导致的报错?

P粉602998670

P粉602998670

2026-08-03

760人浏览

原创

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

如何处理mysql主从复制中由于操作系统句柄限制导致的报错?

MySQL主从复制因 too many open files 报错中断

从库复制线程突然挂掉,Last_IO_ErrorLast_SQL_Error 显示类似 Too many open filesCan'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: NoLast_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 LimitHard Limit 两列
  • 查错误日志真实报错:mysql> SHOW VARIABLES LIKE 'log_error';,然后 tail -n 20 /path/to/error.log,搜 open fileserrno 24

永久修复 ulimit 限制(systemd 环境)

临时改 ulimit -n 65536 没用——MySQL 服务重启后失效。必须改 systemd service 配置:

Android 操作系统的介绍 中文WORD版
Android 操作系统的介绍 中文WORD版

本文档主要讲述的是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\GSlave_SQL_Running 是否为 No —— 如果是,先处理数据冲突或 GTID 错位,否则句柄很快又会打满。

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

1891

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

1703

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

2326

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

1140

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

1614

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

2393

9

mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1118

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

754

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

472

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 124人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习