IT. POST LIST

POST ALL LABEL

Warning: mysql_connect() [function.mysql-connect]: Too many connections in…(db세션연결)

By 때찌때찌맴매 - 12월 03, 2013

출처 : http://www.superuser.co.kr/database/mysql/toomany/toomanyconnections.htm 님 꺼에서 쌔벼옴



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”의 직접적인 이유인 것이다.



그렇다면 문제의 해결은 간단하다.



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



mysqld_safe 실행시에 주는 실행옵션값은 다음과 같다.



./safe_mysqld -O max_connections=1000 -O table_cache=256 -O wait_timeout=300 &



이렇게 실행하면 36개의 MySQL시작옵션중에서 위의 3가지 옵션들만 값들을 임의로 지정하여 실행시킨 것임

이렇게 실행시킨후에 다시 “mysqladmin -u -p variables”로 옵션들값을 확인해 보면 변경되어 있음을 알수 있을 것이다.



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

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



위값을 주고 실행을 시켰을때 my.cnf 파일의 설정 오류가 나온다면 걍 my.cnf 에서 바쭤주자



[root@localhost bin]# vim /etc/my.cnf
[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
set-variable = max_connections=1000 —-> 세션연결 최대 값
set-variable = wait_timeout=300 –>세션종료 지연 값
# Try number of CPU’s*2 for thread_concurrency
thread_concurrency = 8

위에 수정 후 /etc/init.d/mysqld restart

-부과설명-

주의) 위에 세션값 줄때 max_connections=1000 쓸때 붙여 써야됨..안그럼 또 에러

[mysqld]

port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU’s*2 for thread_concurrency
thread_concurrency = 8

max_connections = 1000___

wait_timeout = 300  ______|——> 어떤거는 요로케만 해도됨  상황에 맞게 하자

설정 변경후 확인은 역시

# /usr/local/mysql/bin/mysqladmin -u -p variables

요고를 통해 최대 커넥트 값과 세션 종료 지연값을 확인해 보자~~!!! 위에 내용들이 없을경우에는 걍 추가해 넣으면됨

  • Share:

You Might Also Like

0 개의 댓글