SQLSTATE – Por que MySQL Não Responde?

Problemas de comunicação com banco de dados acontecem em qualquer sistema, independente de ser ou não Magento.

Então na verdade esse post ajuda a todos os desenvolvedores que trabalham com banco de dados, mais especificamente com o MySQL.

O SQLSTATE informa um problema, o que causou o problema de comunicação. Mas não indica sua origem. Vejamos abaixo.

Interpretando as mensagens

Geralmente são mensagens curtas, do tipo:

SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Que na verdade não nos informa nada, apenas o que já sabemos (deu pau!). Uma tradução livre para estas mensagens seriam respectivamente:

Erro genérico: 2013 Fui consultar a base de dados e me perdi na volta
Erro genérico: 2006 O servidor de banco de dados te abandonou

E por isso é tão difícil encontrar uma solução pronta, pois desconhecemos as causas do problema.

Possíveis causas

Servidor fora do ar. E isso pode acontecer por alguns segundos ou algumas horas. O servidor de banco de dados pode ter reiniciado ou desligado.

E isso pode ocorrer por diversas razões, como uma atualização de versão ou segurança, falta de energia, desligamento acidental, sobrecarga, travamentos, etc.

Tempo de resposta. Todo sistema possui um limite de espera, e quando seu sistema “conversa” com o banco de dados, é feito uma solicitação… o MySQL aceita sua solicitação e vai processar… e isso pode levar algum tempo… se você não esperar tempo suficiente, vai embora sem a resposta.

Ou seja, existe uma configuração que informa ao servidor qual o tempo limite de execução para uma solicitação. Se o tempo estourar, o processo é interrompido, e uma mensagem de erro é lançada ao sistema.

Eu não pretendo me aprofundar no assunto, mas existe também a fila de espera. Você quer fazer uma solicitação ao banco de dados, mas antes de você existem outras 300 pessoas aguardando para fazer a consulta. E o volume de transações afeta o seu tempo de resposta, e também na sobrecarga, comentado anteriormente.

Infra-estrutura

Como eu falei no início do post, é difícil dar uma solução definitiva, pois a causa do problema é desconhecida e/ou incerta. Porém, muitas vezes a deficiencia está na infra-estrutura utilizada.

Servidor e Hospedagem. Muita gente confunde servidor e hospedagem, e não é possível dar uma explicação aprofundada no momento. Mas em resumo:

Servidor, é a máquina, o computador que vai permanecer ligado e conectado à internet para que as pessoas acessem seu site.

Hospedagem, é a sua configuração dentro deste servidor, os recursos que estarão disponíveis para seu sistema.

Ambos são importantes, então é imperativo que você contrate um servidor de qualidade, com um bom plano de hospedagem (VPS, Dedicado, ou Cloud).

Empresas recomendadas: Rackspace, Nexcess, UolHost, Hostgator

Configuração

Algumas vezes você consegue resolver o problema através de configuração, ao menos temporariamente (até esgotar os recursos). Acesse seu MySQL através do PhpMyAdmin e clique em Variables.

Variables do phpMyAdmin

Todas as variáveis podem (e devem) ser configuradas conforme a necessidade do seu sistema e/ou volume de acessos. No caso do Magento você poderia alterar os valores de:

#padrão é 10 (segundos), aumente caso seu problema seja o erro 2013.
connect_timeout=30

#tempo máximo (segundos) que o servidor aguarda antes de fechar uma conexão sem atividade.
wait_timeout=300

#recomendável 25% da memória disponível para o banco de dados. acima de 50% a máquina fica lenta.
key_buffer_size=64M

#deve ser o dobro de max_connections
table_open_cache=2000

#quantidade máxima de conexões simultâneas
max_connections=1000

Referência oficial: connect_timeout, wait_timeout, key_buffer_size, table_open_cache, max_connections.

Reinicie o mysql após efetuar as alterações.

Nem sempre você vai ter acesso a essas configurações, principalmente se estiver usando um plano de hospedagem compartilhado.

Atenção! Se você estiver usando um plano compartilhado, os problemas serão recorrentes.

Ao menos agora você tem uma idéia do que pode ser feito para resolver o problema.

Sucesso!