문제

GoDaddy(Linux)에서 호스팅하는 사이트에 MySQL 5.0을 사용하고 있습니다.

웹 앱에서 몇 가지 테스트를 하고 있었는데 갑자기 페이지가 매우 느리게 새로 고쳐지는 것을 발견했습니다.마침내, 오랜 기다림 끝에 "MySQL 오류, 연결이 너무 많습니다..."라는 문구가 있는 페이지에 이르렀고, 이는 데이터베이스에 연결되는 내 config.php 파일을 가리켰습니다.

다른 사용자는 없고 나만 데이터베이스에 연결했습니다.각 페이지의 상단에 config.php 파일을 포함하고 페이지 끝에서 mysql 연결을 닫습니다.그 사이에 여러 가지 쿼리가 있을 수 있습니다.mysql 연결을 충분히 닫지 않은 것 같습니다(mysql_close()).

그러나 쿼리를 실행한 후 닫으려고 하면 페이지에 연결 오류가 발생합니다.내 페이지는 PHP와 HTML입니다.쿼리를 닫으려고 하면 다음 쿼리가 연결되지 않는 것 같습니다.연결하려면 종료 후 config.php를 다시 포함해야 합니까?

2주 만에 약 84명이 이 웹 애플리케이션을 사용하기 시작했기 때문에 이 오류 때문에 겁이 났습니다.

감사해요.

편집하다:

내 페이지의 의사 코드는 다음과 같습니다.

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

이런 식으로 페이지가 열릴 때마다 연결이 열리고 페이지 로드가 완료되면 연결이 닫히는 것으로 생각했습니다.그런 다음 누군가가 페이지의 버튼을 클릭하면 연결이 다시 열립니다.

편집하다:

알겠습니다. 방금 GoDaddy와 통화를 했습니다.분명히 내 경제 패키지에서는 한 번에 50개의 연결로 제한되어 있습니다.오늘 내 문제는 나만 사이트에 액세스하는 동안 발생했지만 이전에는 서버 문제가 있었다고 말했습니다.그러나 내 웹 앱에 84명의 사용자가 있을 예정이므로 한 번에 100개의 연결을 허용하는 "Deluxe"로 업그레이드해야 할 것입니다.어떤 날에는 내 사이트에 한 번에 약 30명의 사용자가 액세스할 수 있으므로 100명이 더 안전할 것이라고 생각합니다.여러분도 동의하시나요?

도움이 되었습니까?

해결책

공유 호스팅 제공 업체는 일반적으로 동일한 사용자에 대해 아주 적은 양의 동시 연결을 허용합니다.

코드가하는 일은 다음과 같습니다.

  • MySQL 서버에 대한 연결을 엽니 다
  • 일을해야합니다 (페이지 생성)
  • 페이지 끝에서 연결을 닫습니다.

마지막 단계는 페이지 끝에서 완료되면 필수적인 : (인용 mysql_close의 매뉴얼) :

스크립트 실행 끝에 비 연개 오픈 링크가 자동으로 닫히기 때문에 mysql_close ()를 사용하는 것은 일반적으로 필요하지 않습니다.

그러나 어쨌든 지속적인 연결을 사용해서는 안됩니다 ...

두 가지 팁 :

  • 사용 mysql_connect 의지 mysql_pconnect (이미 괜찮아)
  • mysql_connect의 네 번째 매개 변수를 false로 설정하십시오 (기본값이기 때문에 이미 괜찮습니다) : (매뉴얼 인용) :

동일한 인수가있는 MySQL_Connect ()에 두 번째 호출이 이루어지면 새 링크가 설정되지 않고 대신 이미 열린 링크의 링크 식별자가 반환됩니다.

new_link 매개 변수는이 동작을 수정하고 mysql_connect ()가 동일한 매개 변수로 이전에 호출 되더라도 MySQL_Connect ()가 항상 새 링크를 열게합니다.



그렇다면 문제를 일으킬 수있는 것은 무엇입니까?

어쩌면 여러 페이지에 동시에 액세스하려고 할 수도 있습니다. (예 : 브라우저에서 여러 탭 사용), 웹 사이트를 사용하여 여러 사용자를 동시에 시뮬레이션합니까?

사이트를 동시에 사용하는 사용자가 많고 사이의 코드가있는 경우 mysql_connect 그리고 연결을 닫는 데 많은 시간이 걸리므로 많은 연결이 동시에 열리는 것을 의미합니다 ... 그리고 한도에 도달하게됩니다. :-(

그럼에도 불구하고, 당신이 응용 프로그램의 유일한 사용자이기 때문에, 당신이 최대 200 개의 동시 연결이 허용된다는 것을 고려할 때, 이상한 일이 있습니다 ...



글쎄, "너무 많은 연결" 그리고 "max_connections"...

내가 정확하게 기억한다면 max_connections 연결 수를 제한하지 않습니다 MySQL 서버에 열 수 있지만 총 연결 수 해당 서버로 열 수 있습니다. 그것에 연결하는 사람이라면.

MySQL의 문서를 인용합니다 너무 많은 연결 :

MySQLD 서버에 연결하려고 할 때 너무 많은 연결 오류가 발생하면 다른 클라이언트가 사용 가능한 모든 연결이 사용되고 있음을 의미합니다.

허용되는 연결 수는 Max_Connections 시스템 변수에 의해 제어됩니다. 기본값은 100입니다. 더 많은 연결을 지원 해야하는 경우이 변수에 대해 더 큰 값을 설정해야합니다.

실제로, 문제는 당신이나 당신의 코드에서 나오지 않을 수 있습니다. (실제로는 괜찮아 보인다) : 당신이 MySQL 서버에 연결하려는 유일한 사람이 아닐 수도 있습니다. ( "공유 호스팅"), 그리고 동시에 그것을 사용하는 사람들이 너무 많습니다 ...

... 그리고 내가 옳고 그게 다야, 문제를 해결하기 위해 할 수있는 일은 없습니다. 해당 서버에 너무 많은 데이터베이스 / 사용자가있는 한 max_connection 200으로 설정되면 계속 고통을 겪을 것입니다 ...


사이드 노트로 : Godaddy로 돌아 가기 전에 그들에게 그것에 대해 물어보기 전에 누군가 내가 방금 말한 것을 검증 할 수 있다면 좋을 것입니다 ^^

다른 팁

나는 약 18 개월 동안 이것을 다루었 다 (http://ianchanning.wordpress.com/2010/08/25/18-Months-of-Dealing-with-a-mysql-too-many-connection-error/)

결국 내가 가진 솔루션은 다음과 같습니다.

  1. 다음에 따라 데이터베이스를 조정하십시오 mysqltuner.
  2. 이를 기반으로 테이블을 매주 해체합니다 게시하다

게시물에서 Bash 스크립트 해제 :

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

지속적인 연결을 사용하지 않도록하십시오. 이것은 보통 나쁜 생각입니다 ..

당신이 그것을 가지고 있다면 .. 대부분의 경우 Apache 프로세스만큼 많은 연결을 지원해야합니다. max_connections 설정을 변경할 수 있습니까?

데이터베이스 서버가 완전히 전용되어 있다고 확신하십니까?

루트로 DatBase에 로그온하고 "ProcessList 표시"를 사용하여 누가 연결되어 있는지 확인하십시오. 시간이 지남에 따라 얼마나 많은 연결이 있는지 확인하고 너무 많은 경우 경고하는 모니터링 시스템에 이상적으로 연결하십시오.

최대 데이터베이스 연결은 my.cnf에서 구성 할 수 있지만 메모리 나 주소 공간이 부족한 것을 조심하십시오.

쉘 액세스 권한이 있는 경우 netstat를 사용하여 데이터베이스에 열려 있는 소켓 수와 해당 소켓의 출처를 확인하십시오.

Linux에서는 다음을 입력합니다.

netstat -n -a |grep 3306

창에서는 다음을 입력합니다.

netstat -n -a |findstr 3306

해결책은 이것들 중 하나 일 수 있습니다. 나는 MCQA 테스트에서 이것을 발견했으며 심지어 어느 것이 옳은지 이해하지 못했습니다!

my.cnf "set-variable = max_connections = 200"에서 설정하십시오.

"globalmax_connections 설정 = 200"명령 실행

mysql 서버에 연결하려면 항상 mysql_connect () 함수를 사용하십시오.

mysql 서버에 연결하려면 항상 mysql_pconnect () 함수를 사용하십시오.

다음은 가능한 해결책입니다.

1) MySQL에서 글로벌 변수를 설정하여 최대 연결 설정을 늘리십시오.

set global max_connection=200;

메모: 서버로드가 증가합니다.

2) 아래와 같이 연결 풀을 비우십시오.

FLUSH HOSTS;

3) 프로세스리스트를 확인하고 프로세스리스트를 원하지 않으면 특정 프로세스리스트를 킬입니다.


당신은 이것을 참조 할 수 있습니다 :-

기사 링크

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top