連接數(shù)據(jù)庫報(bào)錯(cuò)(mysql -v 8.0.24)
message from server: "Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
主機(jī)xx.xx.xx.xx被鎖友鼻,因?yàn)樵S多連接錯(cuò)誤高镐;
如果不求原因
mysql -u root -p 后臺(tái)登陸mysql以后 執(zhí)行 flush hosts;
或者通過設(shè)置較大的 max_connect_errors值
mysql> set global max_connect_errors=1000;
可以暫時(shí)解決問題
雖然報(bào)錯(cuò)解決了埠忘,但是過段時(shí)間以后立哑,還會(huì)報(bào)以上錯(cuò)誤挂滓;
MAX_CONNECT_ERRORS
如果要徹底解決此問題,請(qǐng)往下看
首先了解下MySQL performance_schema下的hosts表和host_cache;我這里是通過navicat premium查看的幔虏;
也可以通過
mysql> use performance_schema;
mysql> select * from host_cache\G;
mysql> select * from hosts\G;
host_cache表會(huì)記錄連接客戶端主機(jī)名纺念、IP地址信息和其他連接信息,幫助診斷連接問題;(flush hosts;清除的是此表的數(shù)據(jù))
需要關(guān)注的兩個(gè)列:
SUM_CONNECT_ERRORS:連接錯(cuò)誤數(shù)
COUNT_HANDSHAKE_ERRORS:握手錯(cuò)誤計(jì)數(shù)
hosts表中記錄了連接客戶端的HOST(主機(jī)名)想括,以及CURRENT_CONNECTIONS(當(dāng)前連接數(shù))陷谱,和TOTAL_CONNECTIONS(總連接數(shù));
看到此處以后瑟蜈,你大概也清除了烟逊,其實(shí)也就是host_cache中SUM_CONNECT_ERRORS=MAX_CONNECT_ERRORS 時(shí),再連接數(shù)據(jù)庫時(shí)報(bào)的錯(cuò)铺根;
#查看值
mysql> show variables like '%max_connect_errors%';
#設(shè)置值
mysql> set global max_connect_errors=3;
那到底什么的錯(cuò)誤宪躯,才會(huì)讓SUM_CONNECT_ERRORS累加1呢?
1.首先排除網(wǎng)上說的密碼錯(cuò)誤位迂,SUM_CONNECT_ERRORS累加1,密碼錯(cuò)誤的話只會(huì)讓COUNT_AUTHENTICATION_ERRORS累加1访雪;
2.由于網(wǎng)絡(luò)原因或其它一些連接錯(cuò)誤會(huì)導(dǎo)致SUM_CONNECT_ERRORS累加1;
網(wǎng)絡(luò)原因 Lost connection to MySQL server at 'XXX', system error: errno囤官;
網(wǎng)絡(luò)原因可以通過設(shè)置connect_timeout解決
#一般默認(rèn)是10s
mysql> mysql> show variables like 'connect_timeout';
mysql> set global connect_timeout=20;
其它原因冬阳,比如
也會(huì)導(dǎo)致SUM_CONNECT_ERRORS累加1蛤虐;
我當(dāng)時(shí)排除網(wǎng)絡(luò)原因党饮、并把所有我知道的數(shù)據(jù)庫連接都關(guān)閉以后,還是發(fā)現(xiàn)SUM_CONNECT_ERRORS值在一直變大驳庭;
這時(shí)候可以通過mysql服務(wù)CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件來查看監(jiān)控情況刑顺;
1.查看是否安裝插件
mysql> show plugins;
2.如果沒有的話,登錄mysql執(zhí)行
mysql>INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql>INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
3.插件安裝成功后(如果只是為了排查問題饲常,其它參數(shù)不要設(shè)置蹲堂,如果有需求可以參考參考官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/connection-control-installation.html)
-- 執(zhí)行下面這個(gè)SQL,看是否有錯(cuò)誤記錄贝淤,錯(cuò)誤記錄會(huì)記錄在information_schema.connection_control_failed_login_attempts表
select * from information_schema.connection_control_failed_login_attempts;
這時(shí)候可以看到用戶主機(jī)柒竞,和失敗的嘗試;
我是通過這個(gè)播聪,找到了一個(gè)主庫朽基,在用一個(gè)不用的用戶,不停的在向從庫發(fā)送請(qǐng)求离陶;然后刪除主從庫關(guān)系稼虎,問題解決;SUM_CONNECT_ERRORS不在增大招刨;
記錄日常一次排錯(cuò)記錄霎俩;