Warning: MySQL server has gone away
Muitos desenvolvedores já devem ter se deparado com essa mensagem sinistra, principalmente quando trabalhamos com hosts mais ou menos, tipo a locaweb e UOLHost... Na maioria das vezes isso se dá quando vamos publicar o site no Host contratado pelo cliente ou fazer uma atualização do Core do Drupal, como foi o meu caso de hoje! Para piorar a situação, nos hosts compartilhados, não temos como alterar as configurações do MySQL ou do PHP, o que dificulta as coisas, mas nada é impossível!
1 - Não entre em pânico!
2 - Verifique na página de Relatório de Status (admin/reports/status) o limite de memória do PHP. O minimo é 64MB, mas o recomendado para o site rodar sem problemas (espacialmente se você está usando Image Cache) é de 128MB. Para alterar essa configuração, inclua no arquivo settings.php do site a seguinte linha:
ini_set('memory_limit', '128M');
Este passo acima por si só, não deve resolver o problema. O erro de Gone Away é geralmente causado por um timeout de consulta, relacionado normalmente ao cache do Drupal ou a tabela watchdog. Para mais detalhes sobre como alterar o limite usando outros métodos (em inglês): http://drupal.org/node/207036
3 - Alterando o limite de timeout no MySQL. Por padrão esse valor é setado para 15 segundos. Podemos forçar o timeout para um valor maior, alterando o arquivo includes/database.mysql.inc inserindo a consulta abaixo, que altera o timeout para 60s:
mysql_query('SET SESSION wait_timeout = 60', $connection);
Esta linha deve ser inserida dentro da função function db_connect() antes da linha
return $connection;
Assim, após alterado, o códeigo deve ficar assim:
(...)
if (!empty($GLOBALS['db_collation'])) {
mysql_query('SET NAMES utf8 COLLATE '. $GLOBALS['db_collation'], $connection);
}
else {
mysql_query('SET NAMES utf8', $connection);
}
mysql_query('SET SESSION wait_timeout = 60', $connection);
return $connection;
(...)
Este "hack" foi criado pelo usuário cog.rusty nos fóruns do Drupal, onde este problema foi discutido extensamente em: http://drupal.org/node/259580#comment-1511512 e para mim funcionou perfeitamente.
4 - Tente desabilitar alguns módulos não essenciais. Na maioria das vezes o gone away começa a acontecer quando rodamos o cron. Isso se deve as vezes do fato do cron estar tentando fazer muitos updates ao mesmo tempo e gerar o timeout. O módulo de busca é um desses, que pode sobrecarregar o cron. Desabilitar o cache, também é uma boa prática, principalmente se seu site tem muito conteúdo. Um outro ajuste que pode fazer diferença são as configurações de busca (admin/settings/search), conforme a figura abaixo:

Nessas configurações definimos quantos itens serão indexados de cada vez (a cada vez que o cron rodar) e isso pode, com certeza causar timeouts. Altere esse valor para baixo e tente rodar o cron novamente.
Em todos os casos, infelizmente, não existe uma receita que resolverá a questão para todos os sites, mesmo porque cada host e até no mesmo hot, planos diferentes, têm limitações diferentes e na pior das hipóteses, mudar de host pode ser a única solução!