检查远程mysql是否正在运行

我想要一个bash shell脚本,我可以使用cron作业来检查远程服务器上的mysql是否正在运行。 如果是,那就什么都不要做,其他的启动服务器。

cronjob将每分钟检查一次远程服务器是否存在(或不)mysql。 我可以自己编写cron作业,但是我需要shell脚本的帮助来检查远程mysql是启动还是closures。 检查后的反应是否上升或下降并不重要。 但是检查很重要。

谢谢。

使用mysqladmin连接到mysqld

MySQL文档说关于mysqladmin ping

检查服务器是否可用。 如果服务器正在运行,mysqladmin的返回状态为0,否则为1。 即使遇到拒绝访问等错误,也是0,因为这意味着服务器正在运行,但拒绝连接,这与服务器没有运行不同。

首先,创build一个没有权限的用户

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

像这样创build一个脚本

 #!/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 

根据需要将该脚本放在crontab中

确保防火墙在3306上打开,这样ping @“%”可以连接。

检查很简单,如下所示:

 mysql -e "select 1" || echo down 

你可以用一个ssh命令replaceecho到root启动服务,但是这似乎有点风险。 它可能有安全隐患。 它可能不可靠。 我build议你应该有一些适当的群集/故障转移软件来做到这一点。 有MySQL MMM,我们曾经使用过一些,但是我明白已经不受欢迎了。

假设你将拥有sshkey auth用于root用户的远程机器的密码login,你可以运行以下命令 –

ssh remotemysql“if ['ps -efww | grep mysql | grep -v grep'];然后echo”server is up“; else echo”server is down“; fi”

用mysql启动脚本replaceecho“server is down”。 说/etc/init.d/mysqld start

正如@khaled在你的问题的评论中所说的那样,实现keepalived会更加可靠。 这可不像你想像的那么可怕。 keepalived将pipe理浮动IP,并告诉它在发生故障转移时运行脚本。 这里有一篇专门介绍如何使用mysqlconfigurationkeepalived的文章:

https://alexzeng.wordpress.com/2012/10/31/how-to-setup-mysql-ha-by-using-keepalived/

您可以修改该configuration以设置主节点和备份,而不是将它们都备份(如果主节点恢复,则需要自动故障回复)。

我想要一个bash shell脚本,我可以使用cron作业来检查远程服务器上的mysql是否正在运行。

这让我充满了恐惧。 我无法想象为什么有人会认为这是pipe理服务的好方法。 Mysql附带的启动脚本将与systemd和sysvinit集成,这是在Linux / Unix系统中启动服务的标准方法。 Systemd内置了重新启动失败服务的function – 但是我从来没有见过默认的configuration来执行这个选项,原因很明显,如果有足够的理由这样做,可以用inittab中的respawn调用sysV系统。 如果这涉及到运行DBMS的每个用户实例(按照Kmail的方式),那么触发器应该由用户会话而不是由cron来控制。

但是撇开这个问题的合法性,使用mysql或mysqladmin来监视服务的状态需要公开证书来连接数据库 – 从安全angular度来看,这不是一个好主意。 它也造成了资源pipe理的复杂性(当你达到最大连接数时,它可能看起来像你的服务已经停止)

您可以判断服务是否从以下位置运行:

  • 在'ps'的输出或/ proc文件系统中存在一个mysqld进程
  • 在相关端口上的侦听套接字(您可以使用netcat进行探测或从netstat的输出中检测)