錯誤:Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
簡述mysql連接流程:
-
根據mysql連接協議,發起握手,在網絡層面里
-
mysql服務器在內存上常見客戶端連接的數據結構
-
連接認證,檢查用戶名,密碼正確不
-
監聽端口,等待命令
原因:
同一個ip在短時間內產生太多(超過mysql數據庫max_connection_errors的最大值)中斷的數據庫連接而導致的阻塞;
max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。
max_connect_errors的值與性能並無太大關系,默認是10。意味着如果某一客戶端嘗試連接此MySQL服務器,但是失敗(如密碼錯誤等等)10次 ,則MySQL會無條件強制阻止此客戶端連接。
如果希望重置此計數器的值,則必須重啟MySQL服務器或者執行mysql> flush hosts; 命令。當這一客戶端成功連接一次MySQL服務器后,針對此客戶端的max_connect_errors會清零。
如果max_connect_errors設置過小,則網頁可能提示無法連接數據庫服務器。
解決方法:
1. 最簡單快捷(治標不治本):
# 登錄mysql
mysql -u root -p
# 執行
flush hosts;
或者
在查找到的安裝bin目錄下使用命令修改:mysqladmin -u xxx -p flush-hosts
刷新緩存,發現錯誤已經解決,但是當max_connection_errors值再次變大后,需重新操作此方法。
備注:配置有master/slave主從數據庫的要把主庫和從庫都修改一遍的;
使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道mysqladmin在哪個目錄下可以使用命令查找:whereis mysqladmin);
2. 提高允許的max_connection_errors數量
進入Mysql數據庫查看max_connection_errors: show variables like '%max_connection_errors%';
show variables like '%max_connection_errors%';
修改max_connection_errors的數量為1000: set global max_connect_errors = 1000;
set global max_connect_errors = 1000;
查看是否修改成功:show variables like '%max_connection_errors%';
show variables like '%max_connection_errors%';
3. 重啟mysqld
也可以在重啟之前,在配置文件中將該參數調大。
# vi /etc/my.cnf
max_connect_errors = 100