mysql出現unblock with 'mysqladmin flush-hosts'
朋友發來消息,說一個系統應用登錄的時候提示連接超時,讓幫忙處理一下。
問他應用和數據庫是否都正常,回復說數據庫好像沒有問題,但是應用日誌報無法連接數據庫。
數據庫版本是:5.5.53
讓他telnet數據庫是否是通的,回復說不通,並發來了信息提示:
# telnet 8.8.9.9 3306 Trying 8.8.9.9... Connected to 8.8.9.9. Escape character is ‘^]‘. gHost ‘kapp‘ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts‘Connection closed by foreign host.
可以看出,產生的原因是:
同一個ip在短時間內產生太多(超過mysql數據庫max_connect_errors的最大值)中斷的數據庫連接而導致的阻塞
讓他查看以下參數並發來結果:
> show variables like ‘max_connect_errors‘; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 2 | +--------------------+-------+
max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。
max_connect_errors的值與性能並無太大關系,默認是10,不知道為何改為了2。意味著如果某一客戶端嘗試連接此MySQL服務器,但是失敗(如密碼錯誤等等)2次 ,則MySQL會無條件強制阻止此客戶端連接。
如果希望重置此計數器的值,則必須重啟MySQL服務器或者執行mysql> flush hosts; 命令。當這一客戶端成功連接一次MySQL服務器後,針對此客戶端的max_connect_errors會清零。
如果max_connect_errors設置過小,則網頁可能提示無法連接數據庫服務器。
以下是解決方案,再貼一下吧。
解決方法1:修改max_connection_errors的值
(1)進入Mysql數據庫查看max_connection_errors:
> show variables like ‘%max_connect_errors%‘;
(2)修改max_connection_errors的值:
> set global max_connect_errors = 100;
(3)查看是否修改成功
> show variables like ‘%max_connect_errors%‘;
解決方法2:使用mysqladmin flush-hosts 命令清理一下hosts文件
(1)在查找到的目錄下使用命令修改:mysqladmin -u xxx -p flush-hosts
備註: 配置有master/slave主從數據庫的要把主庫和從庫都修改一遍的
或者
> flush hosts;
解決方法3:重啟mysqld
也可以在重啟之前,在配置文件中將該參數調大。
# vi /etc/my.cnf
max_connect_errors = 100
mysql出現unblock with 'mysqladmin flush-hosts'