分享一次解决 MySQL too many connections 的过程

阅读本文需要的知识点:

                  1.mysql 数据库最大连接数量是可以手动配置的(参数max_connections)

                  2.实际给普通用户使用的连接数只有N-1个,保留一个连接是留给超级管理员使用的。

                

问题背景

1.数据库连接数配置1000

2.数据库版本8.0.18

3. 其他不重要,问题好解决,本文分享的是解决问题中遇到的趣事。

问题描述

开发人员反馈数据库报错: too many connections

自己上去验证,确实是,

但是令人震惊的是,我也进不去了。按照mysql 官方描述,我超级用户root是可以进去的,mysql会为超级用户保留一个连接的,心里拔凉拔凉滴。

问:为何我要连接进去? 

答: 虽然你官方说的我都相信,但是我就是想进去看看是不是真的连接数满了(show processlist)。  

既然进不去,那我就手动算吧,跟后台开发人员计算后端配置文件中的连接池配置数量,总共只算到了600大概,这tm明显没有超过最大连接数,气氛瞬间就紧张了,直到后来,发现这位同学配置了读写分离,读写都配置了同一台机器,也就是报错的这一台,哎,这么算600*2 ,心情稍稍缓解了下。问题还是要解决啊,咋办呢?

知识点1:经过一番研究查询,原来mysql8.0 已经不再保留一个连接给管理用户,而是需要在配置文件里面配置管理用户的IP 端口,如下:

 admin_address=192.168.1.x
 admin_port=33062
 create_admin_listener_thread=1  # 是否创建单独的线程给管理用

好吧,那就是无解了,只得配置上面参数了重启mysql,再次重现这个问题了。(暂时没有改最大连接数)

知识点2:在上面配置admin_address 参数时候其实最开始我是配置的localhost,但是,当我们重现满连接数的时候,我们仍然无法使用管理用户进去,最惊奇的发现 在连接数没满的时候无论我们使用什么端口(在mysql本机使用 命令行登录),都可以进入到mysql,原来mysql连接分为两种,一种本地sock连接,一种tcp远程连接,只有远程连接才能使用上端口,本地是通过sock文件连的,跟本不关心端口的问题,于是上面使用端口无效的问题 算是解决了。还是太年轻了,网络这块,有待加强啊。

修改最大连接数,max_connections=2000 重启吧,问题解决。

思考1:mysql 为啥要把这个管理用户给tcp连接呢,为啥不能是本机sock连接呢?

猜想1: 延续mysql 前面版本的方式,前面的版本默认就有保留连接(当然也是tcp连接),8.0则需要自己手动配置一些参数才有管理用户的连接。有知道真正原因的还请留言告知啊。

猜你喜欢

转载自blog.csdn.net/qq_32682305/article/details/105845945
今日推荐