MySQL的open_files_limit实际生效值取操作系统限制与配置文件设置的较小值,需同步配置systemd的LimitNOFILE、/etc/security/limits.conf(如适用)及my.cnf中[mysqld]段的open-files-limit=65536,三者缺一不可,且必须重启服务并用/proc/PID/limits和SHOW VARIABLES双重验证。

查 open_files_limit 实际生效值为什么不是 my.cnf 里写的
MySQL 启动时取的是操作系统限制和配置文件限制的较小值,open_files_limit 不是“设了就生效”。常见现象是:改了 my.cnf 里的 open-files-limit=65536,重启后 show variables like 'open%'; 还是显示 1024 或 5000。
原因通常有三处没同步改:
-
/etc/security/limits.conf里对应 mysql 用户(或*)的nofile值太小,比如只写了1024 - systemd 启动 MySQL 时绕过了 limits.conf,需要额外在
/etc/systemd/system/mysqld.service.d/override.conf里加LimitNOFILE=65536 - 启动前没重新登录 shell,导致当前会话的
ulimit -n还是旧值;MySQL 子进程继承父 shell 的限制
验证顺序:先 sudo -u mysql bash -c 'ulimit -n' 看实际能打开多少,再查 show variables like 'open_files_limit';,两者必须一致才真正生效。
为什么 ulimit -n 改了但 MySQL 还不认
Linux 下 ulimit 是 per-process 的,且只对当前 shell 及其子进程生效。MySQL 服务如果由 systemd、supervisord 或 init.d 管理,它不会自动读取你交互式终端的 ulimit 设置。
实操要点:
- 不要只在终端执行
ulimit -n 65536,这仅影响当前 bash,对 mysqld 无效 - 若用 systemd:创建
/etc/systemd/system/mysqld.service.d/override.conf,写入:[Service] LimitNOFILE=65536
,然后运行sudo systemctl daemon-reload && sudo systemctl restart mysqld - 若用 sysvinit(如 old Ubuntu/CentOS 6):确保
/etc/init.d/mysql脚本开头有ulimit -n 65536,或在/etc/default/mysql中导出环境变量
open-files-limit 配置写错位置会导致 MySQL 启动失败
open-files-limit 必须放在 [mysqld] 段下,写到 [client] 或 [mysql] 里会被忽略,甚至让 mysqld 无法启动(报 unknown variable 错误)。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
正确写法示例:
[mysqld] open-files-limit = 65536
注意:
- 该参数最大有效值是 65536(Linux 默认
NR_OPEN上限),设更大也没用 - 参数名是
open-files-limit(带连字符),不是open_files_limit(下划线)——后者是只读变量名,不能用于配置 - 改完必须重启 mysqld,
SET GLOBAL对它完全无效
排查时别漏掉 InnoDB 缓存与连接数的连锁影响
Out of resources when opening file 表面是文件句柄不够,但根源常是其他资源挤占:InnoDB 缓冲池过大 + 连接数过多 → 单连接打开的临时表、日志文件、.MYD/.ibd 文件激增 → 快速耗尽句柄。
建议同步检查:
-
show variables like 'innodb_buffer_pool_size';—— 若超过物理内存 70%,可能引发频繁 swap,间接拖慢文件打开速度 -
show variables like 'max_connections';和show status like 'Threads_connected';—— 连接数长期 > 80% max_connections 时,每个连接默认占用多个句柄(尤其用了临时表或分区表) -
show global status like 'Open_tables';和Table_open_cache_hits—— 若缓存命中率 table_open_cache 太小,会反复 open/close 文件
真正卡点往往在组合:高并发 + 分区表 + 临时表 + 小 table_open_cache,这时哪怕 open_files_limit 设到 65536 也撑不住 —— 得一起调。

















