Reiniciar automaticamente o mysql quando ele morrer

15

Eu tenho um servidor de rackspace que tenho alugado para executar meus projetos pessoais. Desde que eu sou barato, ele tem 256Mb de RAM e honestamente não aguenta muito. De vez em quando, quando há um aumento acentuado no tráfego, o servidor decide começar a matar processos e parece que o mysqld é popular para matar. Tento visitar meu site e sou recebido com a mensagem de que houve um erro ao estabelecer a conexão com o banco de dados. A inspeção dos logs revela que o mysqld foi morto devido à falta de memória.

Como ainda sou tão pobre quanto ontem e não quero atualizar a RAM da minha VM de espaço em rack, existe uma maneira de dizer a ele para reiniciar automaticamente o mysqld quando ele morrer?

Penso em usar algo como o crontab, mas, infelizmente, também não sei exatamente o que fazer lá. Eu acho que sou produto da geração "Linux no seu desktop", já que posso fazer a maioria das coisas no meu desktop e laptop (que executam o Linux quase exclusivamente), mas ainda não tenho muitas habilidades de administração de servidores para o Linux.

O servidor executa o CentOS 6.3

Los Frijoles
fonte
que distro? Acho arrivista faria isso no Ubuntu
Journeyman Geek
Ops. Esqueceu-se de mencionar esse detalhe: CentOS
Los Frijoles
Eh. pode querer incluir a versão também
Journeyman Geek
Para não prejudicar a pergunta, talvez uma solução a longo prazo seja evitar a condição :) Se você deseja apenas um VPS não gerenciado simples para seus projetos pessoais, poderá conseguir um bom preço de uma caixa maior. um provedor especializado em low-end. Fiz isso com grande satisfação. Existem muitos lugares para encontrar esses provedores de VPS, por exemplo, lowendtalk.com.
precisa

Respostas:

16

Esta não é uma solução limpa, obviamente seria melhor evitar o problema em primeiro lugar. De qualquer forma, não tenho certeza de como o CentOS gerencia serviços, mas acho que ele usa service. Nesse caso, você pode verificar se o mysqlserviço está sendo executado com

/sbin/service mysql status

Este comando será encerrado com êxito se mysqlestiver em execução e retornará um status de saída diferente de 0 se eu não estiver. Portanto, você pode iniciar o serviço se ele não estiver em execução com este comando:

/sbin/service mysql status || service mysql start

Você pode adicionar esta linha /etc/crontabpara ativar o comando a cada minuto:

* * * * * /sbin/service mysql status || service mysql start
Terdon
fonte
6

Isso é um pouco perturbador.

O mysqld é sempre reiniciado pelo mysqld_safe porque existe um loop infinito na parte inferiormysqld_safepara verificar se há desligamentos anormais. Se o erro for muito grave, nemmysqld_safeseria possível reiniciarmysqldnas tentativas subseqüentes.

Dada a situação mysqld_safeprojetada, pode não ser uma boa ideia forçar o mysqldinício, caso mysqld_safea rejeite.

Você precisa localizar o log de erros em my.cnf, que estará em

[mysqld]
log-error=log-filename

ou

[mysqld_safe]
log-error=log-filename

Leia o arquivo de texto (provavelmente executando tail -30 log-filename) e encontre a fonte do processamento do mysqld desligada.

RolandoMySQLDBA
fonte
Interessante ... olhando para o meu log, ele diz que o mysqld foi reiniciado, mas cerca de 1-2 horas depois ele dirá que o processo foi encerrado. Depois disso, o próximo registro é o meu início manual. Talvez eu tenha o mysqld_safe configurado errado?
Los Frijoles
3

Em uma tentativa de força bruta para manter as coisas funcionando em um VPS com pouca memória, usei uma modificação da resposta de terdom para verificar e reiniciar o MySQL.

/sbin/service mysqld status || service mysqld restart

Eu precisava mudar mysqlpara mysqldobtê-lo para o trabalho. Sem ele, eu receberia o erro " ERROR! MySQL is running but PID file could not be found".

No meu sistema CentOS 7.2, /sbin/serviceredireciona para /bin/systemctl status, portanto, o comando a seguir é mais rápido de executar.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

Acabei adicionando a seguinte linha ao crontab raiz do sistema. Ele verifica a cada minuto se o MySQL está rodando e redireciona o stdout para null. Iniciar o serviço não produzirá nada a menos que algo dê errado, portanto, não há necessidade de adicionar o redirecionamento nulo no último comando.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

O pipe duplo ||significa ORe executará o 2º comando se o primeiro comando falhar de alguma forma. (Retorna um código de saída maior que zero.)

É como dizer: "Execute o 1º comando ou , se o 1º comando falhar de alguma forma, execute o 2º comando".

Isso é diferente do E comercial duplo, &&que é como dizer: "Execute o 1º comando e , somente se o 1º comando tiver sido bem-sucedido, execute o 2º comando".

Mike J
fonte
1

O seguinte é de jonnyreeves.co.uk :


E o culpado é php-fpm! Um rápido google encontrou outro cliente do Wordpress sofrendo de sintomas semelhantes; o conselho era ajustar a configuração do pool php-fpm (/etc/php-fpm.d/www.conf) e ajustar a configuração da pm. A principal mudança foi passar de pm = dynamicpara pm = ondemandcom um pm.max_childrenvalor de 5(com base na observação de ~ 5% de uso de memória por trabalhador). Depois de alterar a configuração, reiniciei todos os serviços e verifiquei o uso de memória.

service php-fpm restart
service nginx restart
service mariadb restart

Depois de reiniciar, o uso da memória foi significativamente menor.

AdrianoFerrari
fonte