too many connections 에러 해결방법 | Server Side

(문제)

mysql을 설치하여 사용하다보면, 서버부하가 없음에도 불구하고 "Warning...too many connections...."라는 메시지와 함께 MySQL 이 뻗어버리는 경우가 있다.

 

(원인)

근본적 원인은 Mysql의 실행환경변수 설정에 있다.

우선 (Mysql설치홈의 bin디렉토리에서) ./mysqladmin -u -p variables라고 해보시면 다음과 유사한 결과를 얻을 수 있다.

(이하생략...)

 

위 결과에서
max_connections, table_open_cache, wait_timeout  항목을 찾을 수 있다.

 

 

 

max_connections : MYSQL에 connect 할 수 있는 최대 개수

table_open_cache : MYSQL의 테이블캐쉬크기   (5.1버전에서 table_cache -> table_open_cache 로 명칭변경됨)

wait_timeout : MYSQL에 connect하여 쿼리를 지속할 수 있는 시간

 

일단 첫번째로 "too many connections"라는 메시지는 max_connections의 연결 개수를 초과해서 나타나게 된다.

따라서 이 갯수를 적절히 증가조절해야한다.

두번째로 wait_timeout은 connect된 후에 몇초간 지속적으로 연결을 유지할 것인가를 지정해 둔 것이다. 이를 설명하기 위해서는 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요하다.

간단히 설명해 보자면, mysql_connect()함수로 DB connect를 했다면 해당스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지않아도 자동으로 연결이 종료된다. 하지만, mysql_pconnect()함수는 해당스크립트가 종료된후 mysql_close()함수가 호출되었더라도 연결이 끊어지지않은채로 계속 연결을 유지하고 있다. 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만, 그런 이유 외에 추가적으로 직접적인 이유는 바로 "메뉴얼상으로는 mysql_connect()함수를 사용하면 해당스크립트의 종료와 함께 연결이 종료된다고는 하나 실제 작동은 wait_timeout동안 연결을 지속하게 된다" 에서 나오게 된다.
./mysqladmin -u -p processlist"라는 명령어를 통해서 살펴보면 그대로 살아 있음을 알수 있다.

맨위에서 살펴보았던 mysqladmin -u root -p variables의 결과로서 볼수 있는 여러가지 시작옵션들 중 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한채로 남아 있는 것이다. 
따라서, 이것이 "too many connections"의 직접적인 이유인 것이다.

 

 

(해결)

자기가 운용하고 있는 서버의 성능과 용도에 알맞게 해당 variable을 적절히 수정해 주면 된다.

MySQL실행시에 주는 실행옵션값은 다음과 같다. 
mysqld_safe -O max_connections=1000 -O table_cache=512 -O wait_timeout=300 &
일반적으로 실행시킬때에는 기본옵션을 그대로 사용하는 mysqld_safe라는 명령어를 사용했었다. 하지만 위와 같이 실행하면 여러개의 MySQL시작옵션(variable)중에서 위의 3가지 옵션들만 값들을 임의로 지정하여 실행시킨 것이다.
이렇게 실행시킨후에 다시 mysqladmin -u root -p variables로 옵션들값을 확인해보면 변경되어 있음을 알수 있을 것이다. 


(부팅시 매번 적용할 경우)

부팅시마다 매번 자동 적용을 위해서는 /etc/rc.d/rc.local 파일에 아래와 같이 MYSQL을 시작할 수 있도록 설정해주면 된다.

/usr/local/server/mysql/bin/mysqld_safe -O max_connections=1000 -O table_cache=512 -O wait_timeout=300 &

 

Comment Write
Comment List
등록된 코멘트가 없습니다.