2013-04-08 4 views
0

방금 ​​웹 사이트를 Linode로 옮겼으며 현재 1GB RAM 계획을 진행 중입니다. 기본적으로 mysql 사용자 수는 100으로 설정되었습니다. 이로 인해 Too many connections 오류가 발생합니다.구성 오류로 인해 자주 MYSQL 데이터베이스가 손상됨

나는 이것을 이용하여 mysql 설정을 다시 편집했다. 그러나 이제 데이터베이스가 거의 매일 충돌합니다! 여기

내 현재의 MySQL의 설정은 다음과 같습니다 -

key_buffer    = 100M 
max_allowed_packet  = 1M 
thread_stack   = 128K 
thread_cache_size  = 8 
myisam-recover   = BACKUP 
max_connections  = 150 
table_cache  ​ ​  = 1024​ 
query_cache_limit  = 300M 
query_cache_size  = 300M ​ 
max_allowed_packet  = 16M 
key_buffer    = 100M 

사람이 나에게 약간의 변화 또는 왜 내 데이터베이스가 너무 자주 충돌하는 이유를 제시 할 수 있습니까? 주문형 서버에 대한 자세한 내용을 추가 할 수도 있습니다.

편집

내가 추가 한 mysql_close 사방 ($ 콘),하지만 더 내 웹 사이트 somehow.Connections에 대한 문제를 증가 아래에 보이는 결과에 기하 급수적으로 증가하고있다 : -

mysql> show status like '%onn%'; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| Aborted_connects   | 48 | 
| Connections    | 1634 | 
| Max_used_connections  | 8  | 
| Ssl_client_connects  | 0  | 
| Ssl_connect_renegotiates | 0  | 
| Ssl_finished_connects | 0  | 
| Threads_connected  | 4  | 
+--------------------------+-------+ 
7 rows in set (0.00 sec) 

감사 !

+3

안녕하세요 Prashant, 연결이 제대로 닫히지 않았습니까? 과거에 이런 문제가 발생했을 때는 닫히지 않은 연결 때문이었습니다. 이 상자에 미친 양의 트래픽이 발생하지 않는 한 사용자 100 명에 도달하지 않아야합니다. – 99823

+0

파일 실행이 끝날 때 연결이 기본적으로 닫히지 않습니까? –

+1

안녕하세요 Prashant, 연결을 명시 적으로 닫아야합니다 - 데이터베이스를 쿼리하는 웹 사이트에서 어떤 언어를 사용하고 있습니까? – 99823

답변

0

연결을 닫지 않으면 분명히 데이터베이스가 결국 중단됩니다. 다시 시작하면 서버가 재시작되는 모든 연결이 플러시됩니다.

응용 프로그램을 수정하고 연결을 닫습니다. 그 동안 프로세스 목록에서 죽은 채로 남아있는 열린 연결을 제거하기 위해이 스크립트를 가질 수 있습니다. 이 스크립트는 프로세스 목록에있는 모든 것을 500 초 동안 죽입니다. 필요에 따라 시간을 변경할 수 있습니다.

SECONDS_TOO_LONG=500 
QUERIES_RUNNING_TOO_LONG=`/mysql/bin/mysql -u user -p'password' -ANe"SELECT COUNT(1) FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"` 
if [ ${QUERIES_RUNNING_TOO_LONG} -gt 0 ] 
then 
    KILLPROC_SQLSTMT="SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}" 
    /mysql/bin/mysql -u user -p'pass' -ANe"${KILLPROC_SQLSTMT}" | /mysql/bin/mysql -u user -p'pass' 
fi; 
+0

아마도 MYISAM을 사용하고 있습니다. 쿼리 캐시가 메모리에서 더 빠르게 제공되도록 쿼리 캐시를 활성화하려고 할 수 있습니다. 이것들은 좋은 출발점이 될 수 있습니다 .query_cache_limit = 350M query_cache_size = 300M –

+0

귀하의 요구 사항, 하드웨어, 응용 프로그램 및 현재 데이터베이스에 관한 정보를 더 공유한다면 MYSQL을보다 효율적으로 사용하는 방법에 대해 많은 조언을 드릴 수 있습니다. –

+0

거기에 있습니까 어떤 PHP 코드도 똑같이 할 수 있습니까? –

0

실제로 지수 증가 연결의 주요 원인은 내 테이블 자체입니다. MYISAM DB를 사용하고있었습니다. 업데이트를하기 전에 실제로 전체 테이블을 잠급니다. 그래서, 너무 많은 사용자가 내 웹 사이트에 올 경우 결과적으로 문제가 발생합니다.

해결 방법 : -

나는 이노 내 데이터베이스를 변경했습니다. 필요한 개별 행만 잠급니다. 이것은 한 번에 한 자리만큼 낮은 연결로 제한됩니다. Here은 문제를 완전히 해결하는 데 도움이되는 또 다른 질문입니다.