今天數據庫突然無法連接,并且產生如下錯誤:
java.sql.SQLException: null, message from server: "Host '[111.194.83.10](111.194.83.10)' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1038)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2190)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2221)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2016)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:776)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200)
原因: 同一個ip在短時間內產生太多(超過mysql數據庫max_connect_errors的最大值)中斷的數據庫連接而導致的阻塞;
解決方法:
1、提高允許的max_connection_errors數量:
① 進入Mysql數據庫查看max_connection_errors: show variables like '%max_connect_errors%';
② 修改max_connection_errors的數量為1000: set global max_connect_errors = 1000;
③ 查看是否修改成功:show variables like '%max_connect_errors%';
2、使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道mysqladmin在哪個目錄下可以使用命令查找:whereis mysqladmin);
① 在查找到的目錄下使用命令修改:mysqladmin --socket=/tmp/kkimdb.sock --port=3306 -uhyman -p flush-hosts
備注: 配置有master/slave主從數據庫的要把主庫和從庫都修改一遍的(我就吃了這個虧明明很容易的幾條命令結果折騰了大半天);
mysql> flush hosts; 也可以
max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。max_connect_errors的值與性能并無太大關系。
默認情況下,my.cnf文件中可能沒有此行,如果需要設置此數值,手動添加即可。
功能與作用
一般來說建議數據庫服務器不監聽來自網絡的連接,僅僅通過sock連接,這樣可以防止絕大多數針對mysql的攻擊;如果必須要開啟mysql的網絡連接,則最好設置此值,以防止窮舉密碼的攻擊手段。
由于是內網使用,僅做Hive的元數據庫使用,因此使用一下解決方案:
1、果斷 set global max_connect_errors = 10000;
2、同時,在crontab增加一個定時任務,定時執行mysqladmin flush-hosts 命令清理一下hosts文件
修改完成后,問題解決,任務正常運行,后面是否還有問題,還需要繼續觀察!