MySQL异常探究:File Descriptor xxxx exceeded FD_SETSIZE=xxxx

异常LOG

问题表象

表象为:在连接数据库时报以下错误:

The last packet sent successfully to the server was 0 milliseconds ago

导致报此异常LOG的情况真的是太多了,所以为解决此异常,必须去看MySQL的error日志。

查看日志

我找MySQL日志位置的方法,执行如下命令:

ps aux | grep mysql

在结果中找到日志位置:

–log-error=/usr/local/mysql/data/mysqld.local.err

也可以在MySQL客户端输入如下指令来获取:

show variables like ‘log_error’;

日志中显示:

[Warning] File Descriptor 1832 exceeded FD_SETSIZE=1024

从日志可以发现,是mysql打算持有的文件描述符数量超过了系统的限制。

查资料

虽然知道问题就是文件打开过多的问题,但是怎么解决又不知道了。直到我找到如下问题以及回答:https://stackoverflow.com/questions/35347378/ (看elplatt的回答)。

题主的异常LOG和我的是一致的,所以我就开始尝试答案中所说的两个参数:

table_open_cache
max_connections

查看参数目前值

修改之前得先了解自己的MySQL这两个值目前是多少,不能瞎改。在MySQL客户端内输入如下指令获取目前值:

show variables like ‘table_open_cache’;
show variables like ‘max_connections’;

着手修改参数

我发现我的table_open_cache参数值是2000。这明显超过了日志中最大值1024,所以将MySQL此值缩小。

修改/etc/my.cnf:

[mysqld]
table_open_cache=500

然后重启MySQL。发现已经成功!问题不再复现。

开始我是将table_open_cache设置为1025,发现还是超了一些,为1043。所以想,这个参数只控制的是缓存表文件描述符的个数,但是mysql还会打开其他文件啊,比如各种日志文件等。那设置为1025肯定就不行了,得再小点,因为我是本地测试库,所以随意改为500,也不牵扯什么性能,能跑通程序就行。

我没有设置max_connections这个参数,因为我发现我只设置table_open_cache一个参数就能解决我的问题。

祝你好运。

发表评论

电子邮件地址不会被公开。 必填项已用*标注