mysqladmin flush-hosts

連接數據庫報錯(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'"
主機xx.xx.xx.xx被鎖,因為許多連接錯誤;

如果不求原因

mysql -u root -p 后臺登陸mysql以后 執行 flush hosts; 
或者通過設置較大的 max_connect_errors值
mysql> set global max_connect_errors=1000;
可以暫時解決問題

雖然報錯解決了,但是過段時間以后,還會報以上錯誤;
\color{red}{關于這個錯誤,其實就是因為同一IP在短時間內,產生了很多中斷的數據庫連接(超過}MAX_CONNECT_ERRORS \color{red}{的最大值)而導致的;}
如果要徹底解決此問題,請往下看
首先了解下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表會記錄連接客戶端主機名、IP地址信息和其他連接信息,幫助診斷連接問題;(flush hosts;清除的是此表的數據)
需要關注的兩個列:
SUM_CONNECT_ERRORS:連接錯誤數
COUNT_HANDSHAKE_ERRORS:握手錯誤計數


hosts表中記錄了連接客戶端的HOST(主機名),以及CURRENT_CONNECTIONS(當前連接數),和TOTAL_CONNECTIONS(總連接數);

看到此處以后,你大概也清除了,其實也就是host_cache中SUM_CONNECT_ERRORS=MAX_CONNECT_ERRORS 時,再連接數據庫時報的錯;

#查看值
mysql> show variables like '%max_connect_errors%';
#設置值
mysql> set global max_connect_errors=3;

那到底什么的錯誤,才會讓SUM_CONNECT_ERRORS累加1呢?
1.首先排除網上說的密碼錯誤,SUM_CONNECT_ERRORS累加1,密碼錯誤的話只會讓COUNT_AUTHENTICATION_ERRORS累加1;



2.由于網絡原因或其它一些連接錯誤會導致SUM_CONNECT_ERRORS累加1;
網絡原因 Lost connection to MySQL server at 'XXX', system error: errno;
網絡原因可以通過設置connect_timeout解決

#一般默認是10s
mysql> mysql> show variables like 'connect_timeout';
mysql> set global connect_timeout=20;

其它原因,比如



也會導致SUM_CONNECT_ERRORS累加1;

我當時排除網絡原因、并把所有我知道的數據庫連接都關閉以后,還是發現SUM_CONNECT_ERRORS值在一直變大;
這時候可以通過mysql服務CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件來查看監控情況;
1.查看是否安裝插件

mysql> show plugins;

2.如果沒有的話,登錄mysql執行

mysql>INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql>INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';

3.插件安裝成功后(如果只是為了排查問題,其它參數不要設置,如果有需求可以參考參考官網:https://dev.mysql.com/doc/refman/5.7/en/connection-control-installation.html)

-- 執行下面這個SQL,看是否有錯誤記錄,錯誤記錄會記錄在information_schema.connection_control_failed_login_attempts表
 select * from information_schema.connection_control_failed_login_attempts;

這時候可以看到用戶主機,和失敗的嘗試;
我是通過這個,找到了一個主庫,在用一個不用的用戶,不停的在向從庫發送請求;然后刪除主從庫關系,問題解決;SUM_CONNECT_ERRORS不在增大;
記錄日常一次排錯記錄;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容