mysql启动后open_files_limit仍为1024,根本原因是systemd/upstart等init系统不读取/etc/security/limits.conf,必须在service单元文件中显式配置limitnofile,并重启服务验证/proc/pid/limits与show variables双重结果。

MySQL 启动后 open_files_limit 仍是 1024?不是配置没生效,是 systemd/upstart 没读 /etc/security/limits.conf
在 Linux(如 Ubuntu)上用 XAMPP 的 MySQL 时,即使你改了 /etc/security/limits.conf 和 my.cnf 中的 open_files_limit = 24000,重启服务后 SHOW VARIABLES LIKE 'open_files_limit'; 还是返回 1024——这几乎可以确定是 init 系统绕过了用户级 ulimit 设置。
XAMPP 自带的 MySQL 服务在 Linux 上通常由 systemd 或 upstart 管理(取决于发行版),而它们默认不加载 limits.conf。systemd 尤其严格:它只认自己 service 单元文件里的 LimitNOFILE= 配置。
- 先确认你的 XAMPP MySQL 是怎么启动的:运行
ps aux | grep mysqld,看进程是否带--defaults-file=或由systemd派生 - 如果是 systemd(较新 Ubuntu/CentOS),编辑对应 service 文件:
/etc/systemd/system/multi-user.target.wants/xampp-mysql.service或/lib/systemd/system/xampp-mysql.service - 在
[Service]段下添加两行:LimitNOFILE=32000LimitMEMLOCK=infinity(后者可选,防内存锁限制干扰) - 执行
sudo systemctl daemon-reload && sudo systemctl restart xampp-mysql
Windows 下不用管 ulimit,但得检查 my.ini 是否被真正加载
Windows 没有 ulimit 概念,open_files_limit 完全由 MySQL 自身解析 my.ini 决定。但常见问题是:你改了文件,MySQL 却没读它。
- XAMPP 的 MySQL 默认只认
C:\xampp\mysql\bin\my.ini(不是my-default.ini,也不是 Apache 目录下的) - 启动前务必确认该文件中存在且未被注释的配置项:
open_files_limit = 32000 - MySQL 启动时若找不到有效
my.ini,会回退到编译默认值(通常是 1024);可用mysqld --verbose --help | findstr "Default options"查看它实际搜寻的路径列表 - 更稳妥的做法:在命令行手动指定配置启动一次验证:
mysqld --defaults-file=C:\xampp\mysql\bin\my.ini --console,观察控制台输出是否报错或显示加载成功
改完必须重启整个 MySQL 进程,不是 reload
open_files_limit 是 mysqld 启动时一次性设定的内核资源上限,运行中无法动态调整。哪怕你用 SET GLOBAL 或 mysqladmin flush-privileges 都无效。
- 在 XAMPP 控制面板中点击 “Stop” MySQL,等状态彻底变灰、任务管理器里所有
mysqld.exe进程消失后再点 “Start” - 不要依赖“Restart”按钮——某些旧版 XAMPP 的 Restart 实际只是发个 SIGTERM 再拉起,可能复用旧进程上下文
- 验证是否生效:登录 MySQL 后执行
SHOW VARIABLES LIKE 'open_files_limit';,同时用SHOW GLOBAL STATUS LIKE 'Open_files';看当前已打开数,二者应明显小于前者
别忽略 InnoDB 对文件句柄的实际占用
设高 open_files_limit 只是前提,InnoDB 引擎本身也会大量消耗句柄——尤其当 innodb_file_per_table = ON 且表数量多时,每个 .ibd 文件都占一个句柄。
- 检查
innodb_open_files值(默认 300),它控制 InnoDB 缓存多少表空间文件句柄;若库中表超千张,建议同步调高:innodb_open_files = 2000 -
table_open_cache也需匹配:它决定 MySQL 缓存多少张打开的表结构,每张表至少占 1–2 个句柄;设为table_open_cache = 4096更稳妥 - 最终总需求 ≈
open_files_limit ≥ innodb_open_files + table_open_cache + 200(留余量给日志、socket、临时文件等)











