【MySQL】数据库无法连接故障-TooManyConnections

926 阅读2分钟

这是我参与更文挑战的第7天,活动详情查看:更文挑战

一、前言

在一个生产案例中,Java 系统部署在 2台机器上,Java 系统设置的连接池的最大大小为 200。

大致连接图,如下:

连接数过多1.png

发现应用服务器的数据库连接池无法创建连接。

排查操作步骤,如下:

  1. 检查 my.cnf 配置
  2. 查看 MySQL 日志

  1. 检查 my.cnf 配置

检查了下 MySQL 的配置文件 my.cnf,里面有一个关键的参数是 max_connections(即,MySQL 建立的最大连接数),发现是 800。

明明设置了 MySQL 最多可以建立 800 个连接,可为什么 400 个连接都不行?

用命令行登录到 MySQL 上,执行下面命令:

show variables link 'max_connections';

214

发现 MySQL 仅仅只是建立了 214 个连接。


  1. 查看 MySQL 日志

再检查下 MySQL 的启动日志:

Could not increase number of max_open_files to more than mysqld (request: 65535)
Changed limits: max_connections: 214 (request 2000)
Changed limits: table_open_cache: 400 (request 4096)

日志说明:MySQL 发现自己无法设置 max_connections 为我们期望的 800,只能强行限制为 214 !

最后发现,linux 操作系统把进程可以打开的文件句柄数限制为 1024 了,导致 MySQL 最大连接数是 214 !

linux 限制文件句柄,如图:

连接数过多2.png



二、解决

怎么解决这个问题呢?

设置 linux 的文件句柄数设大点:

ulimit -HSn 65535

可以通过如下命令查看最大文件句柄数是否被修改:

cat /etc/security/limits.conf
cat /etc/rc.local

修改完,重启服务器,再重启 MySQLlinux 的最大文件句柄就生效了,这个问题也解决了。

那为什么 linux 最大文件句柄限制为 1024 的时候,MySQL 的最大连接数是 214呢?

MySQL 源码中的一个计算公式,内部写死罢了。