ERROR1040(HY000):Toomanyconnections:DB连接池中连接过多,无法与你建立新的连接。数据库本身有一个连接池。当你的每一个系统都部署在一台机器上时,那台机器上部署的系统实例/服务实例也有一个连接池。你系统的每一个连接Socket都对应着DB连接池中的一个Socket。Connection,这是一个TCP连接:当MySQL告诉你Toomanyconnections时,就是在传达它的连接池里的连接已经满了,你的业务系统不能再和它建立新的连接。案例DB部署在一台64G大内存的机器上,连接这台物理机的Java业务系统部署在两台机器上。Java系统的连接池最大为200,即每个Java业务系统节点最多可以与MySQL建立200个连接,总共最多可以建立400个连接。但是此时如果MySQL报异常ToomanyConnections,说明MySQL目前无法建立400个网络连接。这也太少了吧,这可是高配机啊!于是查看了my.cnf,一个关键的参数是max_connections,也就是MySQL最多可以建立的连接数,设置为800。那为什么两台机器不能只建立400个连接呢?登录MySQL机器,执行如下命令:showvariableslike'max_connections'可以观察到,目前MySQL只建立了214个连接!有没有可能是MySQL没有不关心我们设置的参数?检查MySQL启动日志:Couldnotincreasenumberofmax_open_filestomorethanmysqld(request:65535)Changedlimits:max_connections:214(requested2000)Changedlimits:table_open_cache:400(requested4096)MySQL发现自己无法将max_connections设置为800正如我们所料,所以它被强制为214!因为linux底层限制一个进程可以打开的文件句柄数为1024,导致MySQL的最大连接数为214!Linux文件句柄数的限制也会导致MySQL的最大连接数有限制。怎么解决核心是下面的命令:ulimit-HSn65535然后可以用下面的命令查看是否修改了最大文件句柄数:cat/etc/security/limits.confcat/etc/rc.local如果都修改了,可以确保在mysql的my.cnf中也调整了max_connections参数,然后重启服务器,重启mysql,这样linux的最大文件句柄生效,mysql的最大连接数也生效。这时候尝试业务系统连接DB,不会有问题。为什么Linux的最大文件句柄限制是1024,而MySQL的最大连接数是214?MySQL源码中有一个计算公式,这是计算的结果。默认情况下,linux会限制你每个进程对机器资源的使用,包括:限制可打开的文件句柄限制可打开的子进程数量限制网络缓存限制最大可锁定内存大小因为linuxos的初衷设计是为了尽量避免你的某个进程一下子把机器上的资源全部消耗完,所以默认会限制。我们的一个常见问题是文件句柄限制。因为如果linux把你限制在一个文件句柄太少的进程中,会导致我们无法创建大量的网络连接,我们的系统进程也无法正常工作。比如MySQL在运行的时候,在Linux上其实是一个进程,所以它实际上需要和很多业务系统建立大量的连接。因此,如果你限制它的最大文件句柄数,那么它就不能建立太多的连接!所以,当你在生产环境部署了一个系统,比如DB系统、MQ系统、存储系统、Cache系统之后,你需要调整一些Linux内核参数。文件句柄数一定要调整,一般设置为65535。比如生产环境部署Kafka等MQ,如果Linux内核参数没有优化,Kafka可能无法创建足够的线程,无法运行此时。因此,可以使用ulimit命令来设置每个进程被限制使用的资源量。Use#限制进程使用的各种资源的数量ulimit-acorefilesize进程崩溃时转储文件的大小限制maxlockedmemory最大锁定内存大小openfiles最大可以打开的文件句柄数.maxuserprocesses是可以转发的最大子进程数。设置持久化设置进程的资源后,需要确保在/etc/security/limits.conf文件中执行更改,并永久打印限制。因此,执行完ulimit-HSn65535命令后,使用如下命令查看配置文件中是否实现。向上。cat/etc/security/limits.confcat/etc/rc.local
