索引
问题表象
表象为:在连接数据库时报以下错误:
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一个参数就能解决我的问题。
祝你好运。
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/35