阅读本文需要的知识点:
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则需要自己手动配置一些参数才有管理用户的连接。有知道真正原因的还请留言告知啊。