http://www.eblove.com/rgboard/view.php?&bbs_id=web1004i01&doc_num=67



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

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

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


max_connections | 1000

wait_timeout | 300

와 같은 것을 볼수 있습니다 .


max_connections는 mysql에 connect할수 있는 최대 갯수를 지정해 둔것이다.

"too many connections"라는 메시지는 이 갯수를 초과해서 connect하려고 할때 발생하는 메시지이다.


결론부터 말씀드리자면 이 갯수를 적절히 조절해야한다고 말씀드릴수 있다. 
하지만, max_connections 아래에 있는 wait_timeout이란 variable은 connect된 후에 
몇초간 지속적으로 연결을 유지할 것인가를 지정해 둔 것이다.

이를 설명하기 위해서는 mysql_connect()와 mysql_pconnect의 차이점 그리고, 
mysql_close()함수에 대한 정확한 이해가 필요하다.

간단히 설명해 보자면, mysql_connect()함수로 DB connect를 했다면 해당스크립트가 
종료됨과 동시에 mysql_close()함수를 호출하지않아도 자동으로 연결이 종료된다.

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

 

따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 
사용때문에 발생하는 것 같지만, 직접적인 이유는 그것이 아니라 MySQL의 메뉴얼을 보면 
mysql_connect()함수를 사용하면 해당스크립트의 종료와 함께 연결이 종료된다고 되어있지만 
./mysqladmin -u -p processlist"라는 명령어를 통해서 살펴보면 그대로 살아 있음을 알수 있다.

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

따라서, 이것이 "too many connections"의 직접적인 이유인 것이다.

 

그렇다면 문제의 해결은 간단하다.
실행옵션을 주어서 이들 값들을 자기가 운용하고 있는 서버의 성능과 용도에 알맞게 
수정해 주면 되는 것이다.

 

MySQL실행시에 주는 실행옵션값은 다음과 같다. 
./safe_mysqld -O max_connections=1000 -O table_cache=256 -O wait_timeout=300 &


일반적으로 실행시킬때에는 기본옵션을 그대로 사용하는 "./safe_mysqld"라는 옵션을 사용했다.
이렇게 실행하면 36개의 MySQL시작옵션중에서 위의 3가지 옵션들만 값들을 임의로 지정하여 실행시킨 것이다.
이렇게 실행시킨후에 다시 "mysqladmin -u -p variables"로 옵션들값을 확인해 보면 
변경되어 있음을 알수 있을 것이다.


그리고, 참고로 리눅스 실행시에 mysql을 자동으로 시작하도록 설정해둔 /etc/rc.d/rc.local파일에도

위와 같이 옵션을 함께 주어서 실행하도록 설정하는 것을 잊지말기 바란다. 

+ Recent posts