DB/Mysql

[Mysql] ERROR 1129 (HY000): Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

louky 2020. 10. 27. 11:03
반응형

 Mysql사용시 remote host에서 mysql로 원격 접근시 아래와 같은 메시지가 출력 되면서 정상적으로 접근이 되지 않았다. 

 

Error

ERROR 1129 (HY000): Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

Colsole상에서는 위와 같이 나오지만 java 로그상에서는아래와 같이 나오는 것 같다.

mysql 에러코드:1129 blocked because of many connection erros

내용은 조금 다를수 있지만 그래도 비슷한 맥락이 있다.  Error code 1129 와 Block이 되었다는 점....

 

 

일단 위 증상은 아래와 같다. 

 - Remote 서버에서 Mysql DB로 단순 커넥션 한 뒤  Close를 하게 되면 Mysql은 비정상적인 접속으로 판단하고

    Remote서버의 IP를 블럭킹하게 된다. 

 

이때 Mysql에서는 비정상적인 접속에 대한 요청수를 카운트 하며 설정된 max_connect_error 값에 의해 차단된다. 

기본적으로 max_connect_error 값은 10이며 필요에 따라 변경하여 사용하면 된다. 

 

기본값 확인은 아래와 같이 할 수 있다.

mysql [(none)] > select@@global.max_connect_errors;
+-----------------------------+
| @@global.max_connect_errors |
+-----------------------------+
|                          10 |
+-----------------------------+
1 row in set (0.00 sec)


mysql [(none)] > select@@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                     1024 |
+--------------------------+
1 row in set (0.00 sec)

 

블럭킹이 되었을 경우 접속이 불가 하니 Mysql 서버로 접속하여 아래 명령어를 실행하여 Error count를 초기화 한다. 

mysql [(none)] > flush hosts;
Query OK, 0 rows affected (0.00 sec)

또는 mysqladmin 명령어를 이용하여도 사용할 수 있다. 

sh-4.2# /usr/local/mysql/bin/mysqladmin -uroot -p flush-hosts
Enter password:
sh-4.2#

 

 

max_connections와 max_connect_errors의  값을 실시간 반영은 아래와 같이 한다. 

 

<max_connections 설정 확인 및 변경>

mysql [(none)] > select@@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                     1024 |
+--------------------------+
1 row in set (0.00 sec)

mysql [(none)] > set global max_connections=2048;
Query OK, 0 rows affected (0.00 sec)

mysql [(none)] > select@@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                     2048 |
+--------------------------+
1 row in set (0.00 sec)

 

< max_connect_errors 설정 확인 및 변경>

mysql [(none)] > select@@global.max_connect_errors;
+-----------------------------+
| @@global.max_connect_errors |
+-----------------------------+
|                          10 |
+-----------------------------+
1 row in set (0.00 sec)


mysql [(none)] > set global max_connect_errors=1000;
Query OK, 0 rows affected (0.00 sec)

mysql [(none)] > select@@global.max_connect_errors;
+-----------------------------+
| @@global.max_connect_errors |
+-----------------------------+
|                        1000 |
+-----------------------------+
1 row in set (0.00 sec)

mysql [(none)] >

 실시간 반영이기에 별도로 mysql은 재기동하지 않아도 된다. 

영구 반영이 아니기에 my.cnf에도 등록하고 mysql를 재기동 해줘야만 한다. 

# vi /etc/my.cnf
[mysqld]
~(생략)
max_connections = 300
max_connect_error = 1000

 

 

반응형