分享一次解決 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則需要自己手動配置一些參數纔有管理用戶的連接。有知道真正原因的還請留言告知啊。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章