Erros de conexão do MySQL intermitentes

4

Recentemente, recebi esses erros no meu servidor:

mysql_connect() [function.mysql-connect ]: 
   Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (4)

Não acho que isso seja um problema de credenciais, pois o nome de usuário, a senha, o IP do host e o nome do banco de dados são todos lidos a partir de uma configuração de arquivo simples e armazenados em uma constante do PHP. Além disso, meu log de erros informa que as credenciais usadas são realmente aquelas na configuração.

Eu tentei pesquisar no Google e um me aponta para um problema de max_connections . Este site ainda está em beta e o número de usuários simultâneos não excede 10. Eu procurei o valor de max_connections e está em 2048

A versão do MySQL é 5.0.91 e o servidor é o Gentoo Linux (é o que o version_comment diz). O arquivo de soquete está em /var/run/mysqld/mysqld.sock e a porta é 3306

O que realmente me incomoda é que esse erro parece intermitente. Eu realmente não consigo entender quando estou tentando reproduzi-lo. Alguém disse em um site que o índice de erro (4) significa chamadas interrompidas de sistemas.

Isso significa que posso descartar o erro como uma falha no meu host da Web e não no meu script PHP?

    
por Rolando Cruz 25.08.2011 / 07:06

3 respostas

1

Tente verificar se você não está usando o limite máximo de arquivos de texto aberto dmesg e observando o erro "Muitos arquivos abertos".

Se você está exagerando, você terá que aumentar os limites fixados pelo sistema, alterando o /etc/security/limits.conf com esta declaração:


mysql           soft    nofile          2048
mysql           hard    nofile          4096

Onde 2048 e 4096 são o número máximo de arquivos que o usuário "mysql" pode abrir. (Isso inclui todos os descritores de arquivos, como soquetes)

    
por 25.08.2011 / 10:12
0

Você pode se aprofundar ainda mais utilizando o mysql_error () e mysql_errno () - funções, mas pelo que posso dizer, suas suposições estão corretas.

Como um short bugfix (que eu geralmente implemento em minhas aplicações web) é uma reconexão com o log após dois segundos:

$i = 0;
if ($i < 3 && ($db = mysql_connect(...)) == false) {
    trigger_error('Could not connect to ...', E_USER_WARNING);
    $i++;
    sleep(2);
}
if (!$db)
    die('Could not connect to ... for 3 times with a 2 second dely - giving up');

Como o site tem pouco tráfego, você pode considerar executar um tcpdump no servidor em um arquivo e configurar seu script php para envie-lhe um aviso se uma conexão falhar. Copie o arquivo tcpdump para sua caixa local e analise a falha de conexão via wireshark .

Você também deve verificar os logs do mysql-daemon e os logs do sistema em seu sistema no momento da falha de anomalias.

Esteja ciente de que registrar seu tráfego registrará todo o conteúdo do tráfego, incluindo senhas e outras informações confidenciais, podendo estar violando as políticas ou leis da empresa. Você deve limpar o arquivo tcpdump depois de desativar o registro para não deixar nenhuma informação sensível no servidor e transferir os arquivos via ssh ou qualquer outra conexão criptografada apropriada.

    
por 25.08.2011 / 10:13
0

Se o nome do nó do servidor de referência da sua cadeia de conexão e requer DNS, verifique se a resolução do DNS lento intermediário não está causando o tempo limite na tentativa de conexão. Use localhost se isso for apropriado. Execute o DNS local, se apropriado. Curto-circuito no arquivo LMHOSTS, se apropriado. Elimine totalmente a necessidade de DNS e, se apropriado, especifique o endereço IP. O que quer que seja necessário para não depender da procura de DNS externa, às vezes lenta, do nome do servidor na sua string de conexão.

Às vezes, nada de errado com a string de conexão; às vezes, a resolução do DNS é intermitentemente lenta demais. Isso pode ser uma das causas de problemas de conexão intermitente.

Exemplo: suponha que você tenha uma instância de nuvem hospedando o mysql e o apache, mas às vezes você executa o site na máquina de devor local. Portanto, na sua cadeia de conexão, você usa o nome do nó do servidor completo, portanto, o site 'funciona' ou a partir do site de implementação ou de sua máquina devora. Pode ser o caso que ele nunca falha em sua máquina devo (porque seu DNS deve estar sempre brilhando) mas você obtém problemas de conexão intermitentes no site implementado (porque mesmo que a instância mysql esteja co-localizada, sua string de conexão ainda precisa para ser DNS resolvido de volta para si mesmo, mas o DNS em sua instância de nuvem às vezes não é tão brilhante.Até um pouco enlouquecedor, porque na instância implantada, a instância mysql é realmente local.Mas não é realmente o ponto-- o ponto realmente é , a diferença entre o tempo de resposta DNS da sua máquina devre sob todas as condições de carga, mesmo na instância da nuvem. Assim, torne-a o mais fácil possível na instância da nuvem. O erro não será "DNS foi muito lento" é a causa subjacente.

    
por 03.12.2014 / 22:24