对mysql 建立复合分区(按月建立一级分区,再按天建立二级分区 ),没有查询条件,查询表数据时,爆出如下错误:err Out of resources when opening file './viaresult1/fr_facerecogresult#P#p201906#SP#p201906sp11.MYD' (Errcode: 24 - Too many open files)。原因:打开文件数量太多,超出了open_files_limit
这个参数的限制,在一个表中有多个分区的时候,这种情况更容易发生
1 查看mysql打开的文件
[root@localhost mycat]# ps -le |grep mysqld #查看mysql的进程号
[root@localhost mycat]# lsof -p 10088 |wc -l #查看mysql打开的文件数量
4998
[root@localhost mycat]# lsof -p 10088 #查看mysql 打开的所有文件
2 查看Mysql open_files_limit 限制
show variables like 'open_files_limit%'
5000
由此基本可以断定是mysql open_files_limit限制的原因造成
my.cnf里如果配置了open_files_limit,则open_files_limit最后取值为 配置文件 open_files_limit,max_connections*5, wanted_files= 10+max_connections+table_cache_size*2 三者中的最大值。
如果my.cnf里如果没配置open_files_limit,则open_files_limit最后取值为max_connections*5,10+max_connections+table_cache_size*2,ulimit -n(查看linux 运行进程打开的最大文件数)中的最大者
修改open_files_limit参数
在网上找了很多资料,有的说直接在/etc/mysql/mysql.conf.d/mysqld.cnf文件中的[mysqld]部分添加open_files_limit参数,比如open_files_limit=102400,并且在/etc/security/limits.conf 添加mysql soft nofile 102400和mysql hard nofile 102400这两个参数然后重启MySQL,但是发现不能生效。
以下方法可用:
在文件/etc/systemd/system/multi-user.target.wants/mysqld.service(也有可能是/etc/systemd/system/mysqld.service这个文件)最后添加LimitNOFILE=102400
然后执行systemctl daemon-reload,接着再重启mysql服务sudo service mysql restart,可以看到已经修改成功了。