O erro 2006 chamado MySQL Sever has gone away significa que o servidor se recusou a ligar-se, apesar de estar a funcionar. Existem apenas três razões conhecidas para o aparecimento do erro. A primeira razão é que o servidor está sobrecarregado. O tempo de espera expirou. A segunda razão - o cliente enviou um pacote demasiado doloroso. A terceira razão é o facto de o servidor não ter sido totalmente inicializado. Mais adiante, analisaremos em pormenor as razões pelas quais o erro aparece e como lidar com ele.
Normalmente, o erro aparece quando se tenta ligar à base de dados utilizando o PHP, o cliente da consola ou, no caso de utilizar o PhpMyAdmin:
Vamos examinar cada situação separadamente.
Como mencionado no início deste artigo, uma das causas possíveis é o tempo de espera expirado. Pode ser que o servidor esteja sobrecarregado e não consiga lidar com a carga - processando todas as conexões. Para saber quanto tempo demoram os pedidos do servidor, pode utilizar qualquer cliente de consola e ligar-se ao servidor. Se o conseguir fazer, execute qualquer pedido. Se as consultas demorarem demasiado tempo a processar, pode otimizar o MySQL utilizando um script especial MySQLTuner. Normalmente, aumente o tamanho do pool do motor InnoDB definindo o parâmetro innodb_buffer_pool_size
. O valor ótimo é determinado utilizando o script acima.
Se for 800 megabytes (pode ser qualquer outro tamanho), defina-o:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Existe outra forma de resolver o problema. Para o efeito, o tempo de resposta do servidor é aumentado. Para efetuar esta tarefa, é necessário alterar o parâmetro wait_timeout
. Este é o tempo, em segundos, durante o qual deve esperar por uma resposta do servidor.
Por exemplo:
wait_timeout=500
Ao efetuar alterações, não se esqueça de reiniciar o servidor de seguida:
$ sudo systemctl restart mysql
Ou:
$ sudo systemctl restart mariadb
Quando o cliente de um utilizador cria demasiados pacotes, o servidor gera este erro. O tamanho do pacote disponível (valor máximo) pode ser aumentado utilizando o parâmetro max_allowed_packet
.
Por exemplo:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Preste especial atenção ao cliente, porque se ele enviar muitos pedidos, é óbvio que está a fazer algo de errado. Pelo menos, não gere consultas para o MySQL utilizando loops for
.
Se decidir implementar o MySQL ou o MariaDB no Docker, prepare-se para encontrar um erro semelhante. A inicialização do contentor requer um pouco mais de tempo livre. Se não deixar o contentor concluir a inicialização, parando-o e iniciando-o primeiro, a base de dados devolverá sempre este erro. A solução é remover completamente os dados do contentor da base de dados.
Isto é feito da seguinte forma:
$ docker-compose down
ou:
$ docker rm mysql-container
Em seguida, é necessário eliminar o armazenamento (volume) com a base de dados incorretamente inicializada. Mas, no início, consulte a lista de todos os armazenamentos:
$ docker volume ls
Após a eliminação:
$ docker volume rm volume_name
Agora pode começar a inicializar a aplicação, basta esperar que o servidor de base de dados lhe diga que está pronto e que pode ligar-se a ele.