今天數(shù)據(jù)庫突然無法連接陆蟆,并且產(chǎn)生如下錯誤:
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在短時間內(nèi)產(chǎn)生太多(超過mysql數(shù)據(jù)庫max_connect_errors的最大值)中斷的數(shù)據(jù)庫連接而導致的阻塞跑揉;
解決方法:
1刁俭、提高允許的max_connection_errors數(shù)量:
×摹① 進入Mysql數(shù)據(jù)庫查看max_connection_errors: show variables like '%max_connect_errors%';
② 修改max_connection_errors的數(shù)量為1000: set global max_connect_errors = 1000;
≌歉俊③ 查看是否修改成功:show variables like '%max_connect_errors%';
2苏遥、使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道m(xù)ysqladmin在哪個目錄下可以使用命令查找:whereis mysqladmin);
≡住① 在查找到的目錄下使用命令修改:mysqladmin --socket=/tmp/kkimdb.sock --port=3306 -uhyman -p flush-hosts
備注: 配置有master/slave主從數(shù)據(jù)庫的要把主庫和從庫都修改一遍的(我就吃了這個虧明明很容易的幾條命令結(jié)果折騰了大半天);
mysql> flush hosts; 也可以
max_connect_errors是一個MySQL中與安全有關的計數(shù)器值授瘦,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況醋界。max_connect_errors的值與性能并無太大關系。
默認情況下提完,my.cnf文件中可能沒有此行形纺,如果需要設置此數(shù)值,手動添加即可徒欣。
功能與作用
一般來說建議數(shù)據(jù)庫服務器不監(jiān)聽來自網(wǎng)絡的連接逐样,僅僅通過sock連接,這樣可以防止絕大多數(shù)針對mysql的攻擊帚称;如果必須要開啟mysql的網(wǎng)絡連接,則最好設置此值秽澳,以防止窮舉密碼的攻擊手段闯睹。
由于是內(nèi)網(wǎng)使用,僅做Hive的元數(shù)據(jù)庫使用担神,因此使用一下解決方案:
1楼吃、果斷 set global max_connect_errors = 10000;
2、同時妄讯,在crontab增加一個定時任務孩锡,定時執(zhí)行mysqladmin flush-hosts 命令清理一下hosts文件
修改完成后,問題解決亥贸,任務正常運行躬窜,后面是否還有問題,還需要繼續(xù)觀察炕置!