Verifique se o mysql remoto está rodando

Verifique se o mysql remoto está rodando

Eu quero um script shell bash que eu possa executar usando um cron job para verificar se o mysql em um servidor remoto está em execução. Se for, então não faça nada, apenas inicie o servidor.

O cronjob verificará o servidor remoto em busca de um mysql ativo (ou não) a cada minuto. Eu mesmo posso escrever o cron job, mas preciso de ajuda com o script de shell que verifica se um mysql remoto está ativo ou inativo. A resposta após uma verificação para cima ou para baixo não é importante. Mas a verificação é importante.

Obrigado.

Responder1

Conecte-se ao mysqldusomysqladmin

A documentação do MySQL diz sobremysqladmin ping

Verifique se o servidor está disponível. O status de retorno do mysqladmin é 0 se o servidor estiver rodando, 1 se não estiver. É 0 mesmo no caso de um erro como Acesso negado, pois significa que o servidor está em execução, mas recusou a conexão, o que é diferente de o servidor não estar em execução.

Primeiro, crie um usuário sem privilégios

mysql> GRANT USAGE ON *.* TO ping@'%' IDENTIFIED BY 'ping';

Crie um script como este

#!/bin/bash

MYSQL_USER=ping
MYSQL_PASS=ping
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqladmin ping ${MYSQL_CONN} 2>/dev/null 1>/dev/null
MYSQLD_RUNNING=${?}
if [ ${MYSQLD_RUNNING} -eq 1 ]; then service mysql start ; fi

Coloque esse script em um crontab como desejar

Certifique-se de que o firewall esteja aberto em 3306 para que ping@'%' possa se conectar.

Responder2

A verificação é fácil assim:

mysql -e "select 1" || echo down

Você poderia substituir o echo por um comando ssh no root para iniciar o serviço, mas isso parece um pouco arriscado. Pode ter implicações de segurança. Pode não ser confiável. Eu sugeriria que você provavelmente deveria ter algum tipo de software de cluster/failover adequado para fazer isso. Existe o MySQL MMM, que costumávamos usar, mas entendo que caiu em desuso.

Responder3

Supondo que você tenha sshkey auth para senha menos login para usuário root na máquina remota, você pode executar o seguinte comando -

ssh remotemysql "if [ 'ps -efww | grep mysql| grep -v grep' ]; then echo "servidor está ativo"; senão echo "servidor inativo"; fi"

substitua echo "server is down" pelo script de inicialização do mysql. diga /etc/init.d/mysqld start

Responder4

Eu quero um script shell bash que eu possa executar usando um cron job para verificar se o mysql em um servidor remoto está em execução.

Isso me enche de apreensão. Não consigo imaginar por que alguém pensaria que esta é uma boa maneira de gerenciar um serviço. O Mysql vem com scripts de inicialização que serão integrados ao systemd e ao sysvinit, que são as formas padrão de iniciar um serviço em um sistema Linux/Unix. O Systemd incorporou a capacidade de reiniciar um serviço com falha - mas nunca vi uma configuração padrão exercendo essa opção por razões muito óbvias, e se houvesse uma boa razão para fazer isso, ela poderia ser invocada com um respawn do inittab em um sistema sysV. Se isso estiver relacionado à execução de uma instância por usuário do SGBD (da mesma forma que o Kmail faz), então o gatilho deve ser controlado pela sessão do usuário, não pelo cron.

Mas deixando de lado a legitimidade da questão, usar mysql ou mysqladmin para monitorar o estado do serviço implica expor as credenciais para conexão ao banco de dados - o que não é uma ideia muito boa do ponto de vista de segurança. Também cria complicações em torno do gerenciamento de recursos (quando você atinge o máximo de conexões, pode parecer que seu serviço está inativo)

Você pode saber se o serviço está sendo executado em:

  • a presença de um processo mysqld na saída de 'ps' ou no sistema de arquivos /proc
  • um soquete de escuta na porta relevante (que você pode testar usando o netcat ou detectar na saída do netstat)

informação relacionada