“too many connections” 에러발생시 mysqld_safe의 실행옵션으로 해결하는 방법
작성자 정보
- 구돌 작성
- 작성일
컨텐츠 정보
- 2,486 조회
- 0 추천
- 목록
본문
“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 | |
| | 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의 환경변수 값을 확인하시기 바랍니다.
MYSQL의 max_connections변수값 확인
[root@file
bin]# ./mysqladmin -u root -p variables | grep max_connections |
MYSQL의 table_cache변수값 확인
[root@file
bin]# ./mysqladmin -u root -p variables | grep table_cache |
MYSQL의 wait_timeout변수값 확인
[root@file
bin]# ./mysqladmin -u root -p variables | grep wait_timeout |
위의 3가지 MYSQL환경변수값을 확인 하셨다면 보다 적절한 값을 설정하여 다음과 같이 MYSQL을 시작하시면 됩니다.
[root@file bin]# ./mysqld_safe -O max_connections=500 -O table_cache=256 -O
wait_timeout=57600 & |
위의 예는 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 & |
관련자료
-
이전
-
다음