Não é possível conectar ao servidor MySQL depois de muitas conexões?

1

Hoje meu servidor de banco de dados atingiu o número máximo de conexões e meus aplicativos da Web (em outro servidor) mostram a mensagem de erro "muitas conexões". Depois disso, reiniciei o servidor MySQL, mas um novo problema foi mostrado. Os aplicativos começam mostrando outro erro "Não é possível conectar ao servidor MySQL 'IP do servidor de banco de dados' em (4)". Eu posso conectar-me ao MySQL localmente e rodar sem problemas. Eu posso fazer telnet do servidor da web para a porta 3306 no servidor de banco de dados. Limpei o arquivo de log de erros do MySQL e fiz o teste novamente, mas não encontrei nenhum problema. Eu reiniciei ambos os servidores para ter certeza de que todas as conexões foram eliminadas, mas ainda existe o mesmo problema depois de reiniciar os servidores. Rede está bem, nenhum problema de rede entre os dois servidores, nenhum pacote cair, sem latência, sem mensagens de erro.Depois de três horas, o servidor de banco de dados de volta ao trabalho normalmente!

quais são as razões esperadas para este problema? Por que o servidor voltou ao trabalho depois de três horas? existe algum parâmetro de tempo limite relacionado a isso?

 Edit: My application is PHP and web-server is apache2.
    
por usef_ksa 17.04.2011 / 16:30

2 respostas

2

Parece que seus desenvolvedores não estão fechando corretamente suas conexões no código. Em C #, isso seria algo assim:

var cn = new MySqlConnection(" connection string " );
var cmd = new MySqlCommand(" sql string ", cn);

cn.Open():
cmd.ExecuteNonQuery();
cn.Close();

O código acima é fundamentalmente falho, porque um erro no código sql resultará em uma exceção e, portanto, o código para fechar sua conexão nunca é alcançado. Em vez disso, eles precisam escrever assim:

MySqlConnection cn;
try
{
    cn = new MySqlConnection(" connection string ");
    var cmd = new MySqlCommand(" sql string ", cn);

    cn.Open():
    cmd.ExecuteNonQuery();
}
finally
{
    cn.Close();
}

E, na verdade, o C # tem alguns padrões melhores que eles realmente deveriam usar. Mas isso ilustra o ponto de uma maneira que também se aplica a outras linguagens - qualquer que seja a sua plataforma, o código do cliente para fechar as conexões com o banco de dados deve acontecer de uma maneira que leve em conta exceções.

    
por 17.04.2011 / 19:39
1

Talvez você possa executar FLUSH HOSTS;

De acordo com o link

Esvazia as tabelas de cache do host. Você deve liberar as tabelas do host se alguns de seus hosts alterarem o endereço IP ou se você receber a mensagem de erro Host 'host_name' está bloqueado. Quando mais de max_connect_errors erros ocorrem sucessivamente para um determinado host durante a conexão com o servidor MySQL, o MySQL assume que algo está errado e bloqueia o host de outras solicitações de conexão. A limpeza das tabelas do host permite mais tentativas de conexão do host. Veja Secção C.5.2.6, “Host 'host_name' está bloqueado”. Você pode iniciar o mysqld com --max_connect_errors = 999999999 para evitar esta mensagem de erro

Eu também procuraria reduzir o fluxo de fundos:
join_buffer_size
sort_buffer_size
read_buffer_size
read_rnd_buffer_size

e aumentando max_connections

    
por 17.04.2011 / 19:29