You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

最后几步配置

  1. 给脚本添加执行权限:
chmod +x /opt/monit/check_mysql.sh
  1. 手动测试脚本,确认退出码正确:
# 正常情况下应该返回0
/opt/monit/check_mysql.sh
echo $?
# 停掉MySQL后再执行,应该返回1
systemctl stop mariadb
/opt/monit/check_mysql.sh
echo $?
  1. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:04:31