2012-02-22 5 views
2

다음은 mysql 오류입니다 : 연결 실패 : 'db2498'사용자가 'max_user_connections'자원 (현재 값 : 200)을 초과했습니다. 'max_user_connections'가 200으로 설정 - 여전히 오류가 발생합니다.

[mysqld] 
max_connections = 500 
max_user_connections = 200 

가 나는 또한 200 사용자에 대한 MySQL의에서 MAX_USER_CONNECTIONS을 설정

은 내가 my.cnf 파일을 설정합니다. 1400 명이 약 10 ~ 20 분 안에 사이트를 강타했습니다. 각각은 평균 14 초 동안 머물러 있으며, 나는이 메시지 중 약 1400 점을 얻었다.

저는 PHP/MySQL을 사용하고 있습니다.

$conn = new DB(); 
$result = $conn->selectSomething(); 
/* do something */ 

$result = $conn->selectSomething(); 
/* do something */ 

$result = $conn->selectSomething(); 
/* do something */ 

사용자 14 초 평균의 사이트에 있습니다 :

class DB{ 

public function __construct(){ 
    $this->conn = new mysqli($this->host,$this->user,$this->pass,$this->db); 
    /* check connection */  
} 
public function selectSomething(){ 
    /* select data & return */ 
} 
public function __destruct() 
{ 
$this->conn->close(); 
} 
} 

이 내가 그것을 호출하는 방법입니다 : 이것은 데이터베이스 클래스입니다. 이 오류가 발생하는 이유는 무엇입니까? 파괴인가? 데이터베이스 래퍼가 잘못 설정 되었습니까? 나는 길을 잃었고 기술 지원은별로 도움이되지 않습니다. 서버는 이미 너무 많은 오픈 연결이)

1 : "최대 연결"문제에 관해서는

+0

사용자 연결! = 사용자 – JohnFx

답변

3

,이 세 가지 중 하나가 될 수 있습니다. MySQL 서버는 허용하기를 거부하기 전에 특정 개수의 열린 연결만을 처리 할 수 ​​있으며,이 제한은 서버의 모든 사용자가 공유합니다. 꽤 많은 수의 연결을 통해 MySQL 서버를 효과적으로 DoS 할 수는 있지만 (보통은 아래 참조)

2) 사용자 계정은 시간당 허용되는 연결 수가 제한되어 있습니다. 그 시간 내에 거부 될 것입니다. 이 값은 사용자별로 설정됩니다.

3) 귀하의 사용자 계정에는 허용되는 열린 연결 수가 제한되어 있습니다. 추가 연결은 거부됩니다. 이 값은 사용자별로 설정됩니다.

대부분의 경우 실패의 정확한 원인을 정확히 알려주기 때문에 연결 시도에서 반환되는 오류 메시지를 읽는 것이 항상 중요합니다.

계정이 연결 제한의 최대 수있는 경우 (시나리오 # 3), 오류는 다음과 같습니다 코드 : 'mysqldba는'사용자 이름이 될 것입니다

ERROR 1226 (42000): User 'mysqldba' has exceeded the 'max_user_connections' resource (current value: 1) 

하고, '현재 가치' 이 사용자가 허용하는 최대 연결 수입니다.

당신은 시간 제한에 따라 연결의 최대 개수가 계정 경우 (시나리오 # 2) 오류는 다음과 같습니다 코드 :

다시 한 번 'mysqldba는'사용자 이름 것,
ERROR 1226 (42000): User 'mysqldba' has exceeded the 'max_connections_per_hour' resource (current value: 1) 

, '현재 값'은이 사용자에게 허용 된 시간당 최대 연결 수입니다.

오류 메시지 (코드 1040)가 나타나면 전체 MySQL 서버의 연결 슬롯이 부족하다는 것을 나타냅니다. 위에서 언급 한 DoS 시나리오입니다.

어떻게 할 수 있습니까? 위에서 말했듯이이 서버에 대한 수퍼 유저 권한이 없으므로 해당 서버를 담당하는 SysAdmin에게 불만을 제기하지 않습니다.그것들은 허용되는 최대 연결 수를 늘려 단기간에 문제를 해결할 수 있지만 서버를 사용하는 다른 사람이 데이터베이스 연결을 바보로 만들면 슬롯이 다시 채워집니다. 사용자가해야 할 일은 최대 사용자 연결 최대 연결 제한도 강화하는 것입니다. 이렇게하면 무거운 사용자가 서버를 막히게됩니다. 너와 같은 공유 서버 상황에서 이것은 가장 이해가가 능하다. '파워 유저'는 자신의 서버를 소유 할 것인가 /해야 하는가 아니면 최대 연결을 늘리거나 지불해야 할 것인가.

+0

SU 수 있습니다. 내 상자 야. 경고 : mysqli :: mysqli() [mysqli.mysqli] : (42000/1226) : 'user3903'사용자가 'max_user_connections'리소스 (현재 값 : 200)를 초과했습니다. 값을 변경할 수있는 권한이 있습니다. my.cnf를 변경했습니다. 내 데이터베이스 래퍼입니까? 연결이 닫히지 않았습니까? –

+1

연결이 제대로 닫히지 않은 것 같습니다. 대신에 mysql_pconnect (...)와 같이 영구 연결을 사용하려고 할 수 있습니다. 때때로 mysqli 래퍼가 정상적으로 작동하지 않습니다 ... – bodi0

+0

@ bodi0이 (가) 죽었습니다. 쿼리를 완료 한 후에 mysqli :: close를 사용하고 있는지 확인하십시오. – zmonteca

관련 문제