閱讀本文需要的知識點:
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則需要自己手動配置一些參數纔有管理用戶的連接。有知道真正原因的還請留言告知啊。