강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

“too many connections” 에러발생시 mysqld_safe의 실행옵션으로 해결하는 방법

작성자 정보

  • 구돌 작성
  • 작성일

컨텐츠 정보

본문

“too many connections” 에러발생시 mysqld_safe의 실행옵션으로 해결하는 방법

 

정상적으로 잘 돌아가던 MYSQL서버가 어느날 갑자기 "Warning...too many connections...."라는 에러 메시지와 함께 종료되어 버리는 경우가 있습니다.   

 

 

 이에 대한 근본적인 원인은 MYSQL의 환경변수에 설정되어 있는 “max_connections”의 값을 초과하는 쿼리가 발생하였기 때문입니다.   

 

 

 

이에대한 원인을 설명하기 위해서는 php에서 사용하는 MYSQL연결함수인 mysql_connect() mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요합니다.   

 

 

 

간단히 설명해 보자면, mysql_connect()함수를 이용하여 MYSQL에 연결하였다면 해당 스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지 않았다하더라도 자동으로 연결이 종료됩니다.   

 

 

 

하지만, mysql_pconnect()함수는 해당스크립트가 종료된 후 mysql_close()함수가 호출되어도 연결이 끊어지지 않은 채로 계속 연결을 유지하고 있습니다.   

 

 

 

따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만 (물론 그런 이유도 있을 수 있지만) 근본적인 원인은 이와 다를 수 있습니다.   

 

 

  , MYSQL의 메뉴얼을 보면 mysql_connect()함수를 사용하면 해당스크립트의 종료와 함께 연결이 종료된다고 되어있지만 앞에서 설명드렸던 바와 같이 ./mysqladmin -u root -p processlist"라는 명령어를 통해서 살펴보면 해당 프로세스가 종료되지 않고 그대로 남아있다는 것을 알 수 있습니다.   

 

 



[root@file bin]# pwd

/usr/local/mysql/bin

[root@file bin]#

[root@file bin]# ./mysqladmin -u root -p processlist

Enter password: ********

+----+------+-----------+-------+---------+------+-------+------------------+

| Id | User | Host      | db    | Command | Time | State | Info    |

+----+------+-----------+-------+---------+------+-------+------------------+

| 2  | papa | localhost | papa  | Sleep   | 615   |       |       |
| 4  | papa | localhost | papa  | Sleep   | 1025   |       |      |
| 5  | papa | localhost | papa  | Sleep   | 109   |       |       |
| 6  | papa | localhost | papa  | Sleep   | 384   |       |       |
| 7  | papa | localhost | papa  | Sleep   | 455   |       |       |

| 8  | root | localhost | mysql  | Sleep   | 347   |       |      |

| 12  | root | localhost |       | Query   | 0    |       | show processlist |

+----+------+-----------+-------+---------+------+-------+------------------+

[root@file bin]#


결론적으로 "mysqladmin -u -p variables"의 결과로서 볼 수 있었던 MYSQL의 환경변수값들 가운데 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한 채로 남아 있는 것입니다.   

 

 

  

따라서, 이것이 "too many connections"에러가 발생하는 궁극적인 원인이 되는 것입니다.   

 

 

 

 

이를 해결하려면 MYSQL이 빠른 응답을 할 수 있도록 서버 하드웨어 사양(CPU, 메모리등)을 높이는 방법도 있겠지만 급하게 조치 해야하는 경우에는 MYSQL의 필요한 변수의 값을 보다 높게 설정하는 방법이 현명할 것입니다.   

 

 

 

앞의 예에서 살펴보셨듯이 “./mysqladmin -u  root -p variables"라고 하면 MYSQL의 전체 환경변수의 값을 확인 할 수 있을 것입니다.   

 

 

 이들 MYSQL 환경변수 가운데 다음 3가지의 값을 현재보다 높게 설정함으로서 “too many connections”에러를 응급조치할 수 있습니다.   

 

 

 

max_connections : MYSQL connect할 수 있는 최대 개수
table_cache     : MYSQL
의 테이블캐쉬크기
wait_timeout    : MYSQL
connect하여 쿼리를 지속할 수 있는 시간

, 다음과 같이 MYSQL의 환경변수 값을 확인하시기 바랍니다.   

 

 

 

MYSQLmax_connections변수값 확인

[root@file bin]# ./mysqladmin -u  root -p variables | grep max_connections
max_connections                 100
[root@file bin]#


MYSQL
table_cache변수값 확인

[root@file bin]# ./mysqladmin -u  root -p variables | grep table_cache
table_cache                     64
[root@file bin]#


MYSQL
wait_timeout변수값 확인

[root@file bin]# ./mysqladmin -u  root -p variables | grep wait_timeout
wait_timeout                    28800
[root@file bin]#

 

위의 3가지 MYSQL환경변수값을 확인 하셨다면 보다 적절한 값을 설정하여 다음과 같이 MYSQL을 시작하시면 됩니다.   

 

 

 

[root@file bin]# ./mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &
[root@file bin]#


위의 예는 max_connections값과 table_cache, 그리고 wait_timeout값을 앞의 경우보다 더 높게 설정하여 MYSQL을 시작한 것입니다.   

 

 

  주의하실 것은 위의 변수들 가운데 wait_timeout값은 높이는 것만이 능사가 아니라는 점입니다.   

 

 

 , 경우에 따라서는 이 변수값을 낮추는 것이 효율적인 경우도 있습니다.   

 

 

 

이와 같이 실행시킨 후에 다시 "./mysqladmin -u root -p variables"로 새로 설정된 변수값들이  변경되어 있음을 직접확인해 보시기 바랍니다.   

 

 

 

 

그리고 이와 같은 방법으로 “too many connections”에러가 해결이 되었다면 재부팅시에 MYSQL을 시작하면서 매번 자동 적용을 위하여 /etc/rc.d/rc.local파일에 아래와 같이 MYSQL을 시작할 수 있도록 설정해 두시는 것도 좋은 방법이 됩니다.   

 

 

 

/usr/local/mysql/bin/mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,807 개
  • 현재 접속자 :  163 명