起因:有一部署于 CentOS7.6 的 MySQL 报错。报错信息类似这样的:[ERROR] /usr/sbin/mysqld: Can't open file: './xxxx.frm' (errno: 24 - Too many open files)。有经验的各位一看就知道是设置的文件打开数设置过低导致的。
于是有了下面的排查经过:
1、查看my.cnf确认配置的参数,发现配置的如下:
open_files_limit = 65535
innodb_open_files = 20480
明显配置文件设置没有问题
2、查看系统级别的文件打开数限制
cat /etc/security/limits.conf
* hard nofile 1000000
* soft nofile 1000000
* soft core unlimited
* soft stack 10240
明显系统配置也没有问题
3、查看mysql中的参数
show variables like 'open_files_limit';
+------------------+-------------+
| Variable_name | Value |
+------------------+-------------+
| open_files_limit | 1024 |
+------------------+-------------+
这就很奇怪了,明明配置参数都没有配置错误,为什么实际加载的参数值不是配置文件中设置的参数值呢?
原来如果使用systemctl启动的mysqld实例,需要在/usr/lib/systemd/system/mysqld.service配置文件[Service]模块中添加如下配置项:
LimitNOFILE=65535
保存后,执行:
systemctl daemon-reload
systemctl restart mysqld.service
以上才能解决开头中说到的问题,具体原因需要进一步研究。