如何编写Monit监控MySQL/MariaDB的检查脚本以实现Slack告警
如何编写Monit监控MySQL/MariaDB的检查脚本以实现Slack告警
嘿,我来帮你搞定这个check_mysql.sh脚本的问题!其实核心思路很简单:这个脚本需要检查MySQL/MariaDB的状态是否正常,并且返回对应的退出码——0代表一切正常,非0代表出问题了,这样Monit就能根据status !=0的条件触发Slack告警。
下面给你几种实用的脚本写法,你可以根据自己的需求选:
方法一:用mysqladmin ping检查连通性(最基础)
mysqladmin是MySQL自带的工具,用来快速检查服务是否可连接,非常适合基础监控。
1. 先创建一个专用的Monit监控用户(安全起见,别用root)
登录MySQL/MariaDB执行以下SQL,创建一个只有最小权限的用户:
CREATE USER 'monit_check'@'localhost' IDENTIFIED BY '你的安全密码'; -- 只赋予PROCESS权限,足够让mysqladmin ping工作 GRANT PROCESS ON *.* TO 'monit_check'@'localhost'; FLUSH PRIVILEGES;
2. 编写check_mysql.sh脚本
#!/bin/bash # 使用mysqladmin检查MySQL是否可正常响应 mysqladmin -u monit_check -p'你的安全密码' ping > /dev/null 2>&1 # 根据命令退出码返回状态:0正常,1异常 if [ $? -eq 0 ]; then exit 0 else exit 1 fi
3. 优化:避免明文密码(更安全)
如果不想在脚本里写明文密码,可以把用户名密码放在执行脚本用户的.my.cnf文件里(比如Monit用root运行,就放/root/.my.cnf):
[mysqladmin] user=monit_check password=你的安全密码
然后给这个文件设置严格权限,防止其他人读取:
chmod 600 /root/.my.cnf
这时脚本可以简化成:
#!/bin/bash mysqladmin ping > /dev/null 2>&1 # 直接返回mysqladmin的退出码 exit $?
方法二:自定义检查逻辑(进阶需求)
如果需要监控更细粒度的状态(比如特定数据库是否可用、连接数过高),可以扩展脚本:
示例1:检查特定数据库是否可访问
#!/bin/bash # 尝试连接指定数据库并执行简单命令 mysql -u monit_check -p'你的安全密码' -e "USE 你的数据库名;" > /dev/null 2>&1 exit $?
示例2:检查连接数是否超过阈值
#!/bin/bash # 设置允许的最大连接数 MAX_CONNECTIONS=150 # 获取当前活跃连接数 CURRENT_CONNECTIONS=$(mysql -u monit_check -p'你的安全密码' -e "SHOW STATUS LIKE 'Threads_connected';" | awk '{print $2}') # 如果当前连接数超过阈值,返回异常码 if [ "$CURRENT_CONNECTIONS" -gt "$MAX_CONNECTIONS" ]; then exit 1 else exit 0 fi
最后几步配置
- 给脚本添加执行权限:
chmod +x /opt/monit/check_mysql.sh
- 手动测试脚本,确认退出码正确:
# 正常情况下应该返回0 /opt/monit/check_mysql.sh echo $? # 停掉MySQL后再执行,应该返回1 systemctl stop mariadb /opt/monit/check_mysql.sh echo $?
- 确认Monit的
check program配置正确指向脚本,触发条件无误。
额外小提示:其实你可以不用单独的脚本!
看你现有Monit配置里已经有check process mysqld的监控了,如果你只是想监控MySQL是否存活,完全可以直接在这个配置里添加Slack告警触发,不用单独写check_mysql.sh:
check process mysqld with pidfile /var/run/mysqld/mysqld.pid group database group mysql start program = "/etc/init.d/mariadb start" stop program = "/etc/init.d/mariadb stop" if failed host localhost port 3306 protocol mysql with timeout 15 seconds for 3 times within 4 cycles then restart if failed unixsocket /var/run/mysqld/mysqld.sock protocol mysql for 3 times within 4 cycles then restart if 5 restarts with 5 cycles then timeout # 直接在这里添加Slack告警触发 if failed host localhost port 3306 protocol mysql with timeout 15 seconds for 3 times within 4 cycles then exec /path/to/slack.rb depend mysql_bin depend mysql_rc
这样是不是更省事?当然如果有自定义监控需求,还是用单独的脚本更灵活~
备注:内容来源于stack exchange,提问作者neilgee
相关产品推荐
相关产品推荐

