在Mysql中,打开文件数过多会出现too many open files错误。
与文件打开数有关的参数:
1、max_connections
最大连接数:
增加该值会增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
2、table_open_cache
表高速缓存数量:
当某一连接访问一个表时,MySQL会检查当前已缓存表的数量。如果该表已经在缓存中打开,则会直接访问缓存中的表已加快查询速度;如果该表未被缓存,则会将当前的表添加进缓存并进行查询。
table_open_cache用于限制缓存表的最大数目,它的作用就是缓存表文件描述符,如已经缓存的表未达到该值,则会将新表添加进来;若已经达到此值,MySQL会根据缓存表的最后查询时间、查询率等规则释放之前的缓存。
注意:在InnoDB存储引擎中,表的打开不受该参数限制,因为InnoDB会将其放到数据字典中,即在ibd文件里。
3、open_files_limit
操作系统运行mysqld打开的文件数目,该参数基于系统启动时指定的值。
有效的open_files_limit 计算公式如下:
- 10 + max_connections + (table_open_cache * 2)
- max_connections * 5
- 启动时设定的open_files_limit,如果没有指定默认为5000
备注:如果open_files_limit的值未设置,会使用以上三个值中的最大值作为获取文件描述符的数量。
这里需要注意的是:
1、在一个已经设置open_files_limit值的系统中,修改操作系统ulimit -n的值是不起作用的;
2、在未设置open_files_limit值的系统中,可以通过修改操作系统ulimit -n的值来完成设置;
3、两者都需要重启数据库来让配置生效。