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

如何实现主库GTID与从库GTID不一致时自动触发邮件告警

MariaDB主从GTID校验告警方案

该需求完全可实现,核心逻辑是定时分别拉取主库、从库的GTID执行位点,判断从库已执行的GTID集合是否包含主库全部已提交GTID,若存在差值则触发邮件告警。具体操作步骤如下:


1 前置准备

  • 主从库分别创建最低权限的监控账号,仅赋予REPLICATION CLIENT权限即可,授权语句示例:
GRANT REPLICATION CLIENT ON *.* TO 'gtid_monitor'@'脚本运行服务器IP' IDENTIFIED BY '自定义强密码';
FLUSH PRIVILEGES;
  • 脚本运行环境提前安装依赖:mariadb-client(用于执行数据库查询)、mailx或sendmail(用于发送告警邮件)、cron(定时任务组件,绝大多数系统默认自带)

2 校验脚本编写

脚本逻辑如下:

  1. 预定义主从库连接信息、告警收件人、日志路径等配置项
  2. 分别查询主库当前gtid_binlog_pos(已提交的GTID集合)、从库当前gtid_slave_pos(已执行的GTID集合)
  3. 调用MariaDB原生函数GTID_SUBSET()判断主库GTID是否是从库GTID的子集,返回0则代表主从GTID不一致
  4. 不一致时拼装告警内容发送邮件,同时记录每次校验的日志便于排查
  5. 清理临时产生的中间文件

示例脚本(bash)

脚本命名为check_mariadb_gtid.sh,内容如下:

#!/bin/bash
# 配置项 - 请根据实际环境替换
MASTER_HOST="主库IP地址"
SLAVE_HOST="从库IP地址"
DB_USER="gtid_monitor"
DB_PASS="监控账号密码"
ALERT_EMAIL="告警收件人邮箱"
LOG_FILE="/var/log/mariadb_gtid_check.log"

# 获取主从库GTID位点
MASTER_GTID=$(mysql -h${MASTER_HOST} -u${DB_USER} -p${DB_PASS} -N -e "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_pos';" | awk '{print $2}')
SLAVE_GTID=$(mysql -h${SLAVE_HOST} -u${DB_USER} -p${DB_PASS} -N -e "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos';" | awk '{print $2}')

# 校验GTID一致性
CHECK_RESULT=$(mysql -h${MASTER_HOST} -u${DB_USER} -p${DB_PASS} -N -e "SELECT GTID_SUBSET('${MASTER_GTID}', '${SLAVE_GTID}');")

# 写入校验日志
echo "$(date +'%Y-%m-%d %H:%M:%S') 主库GTID: ${MASTER_GTID} 从库GTID: ${SLAVE_GTID} 校验结果: ${CHECK_RESULT}" >> ${LOG_FILE}

# 不一致触发告警
if [ ${CHECK_RESULT} -eq 0 ]; then
    echo "MariaDB主从GTID不一致,请立即排查!
    主库地址:${MASTER_HOST}
    主库当前GTID:${MASTER_GTID}
    从库地址:${SLAVE_HOST}
    从库当前GTID:${SLAVE_GTID}" | mail -s "【紧急告警】MariaDB主从GTID不一致" ${ALERT_EMAIL}
fi

脚本编写完成后赋予执行权限:
chmod +x /path/to/check_mariadb_gtid.sh
建议先手动执行一次脚本,校验数据库连接、邮件发送功能是否正常。


3 配置定时任务

使用cron配置定时执行规则,比如每5分钟校验一次,执行crontab -e添加如下配置:

*/5 * * * * /path/to/check_mariadb_gtid.sh >/dev/null 2>&1

保存后重启cron服务生效:

  • CentOS/RHEL系:systemctl restart crond
  • Debian/Ubuntu系:systemctl restart cron

4 注意事项

  • 避免明文存储数据库密码:可以将监控账号密码配置到/etc/my.cnf的[client]段,脚本中去掉-p${DB_PASS}参数即可降低泄露风险
  • 避免主从延迟误报:可以先查询从库SHOW SLAVE STATUS返回的Seconds_Behind_Master值,延迟超过阈值时可以延迟重试,或在告警中注明存在主从延迟
  • 多从库场景可在脚本中加循环,遍历所有从库逐一校验
  • 可结合MaxScale的maxctrl list servers命令二次校验节点状态,降低误报概率
  • 定期查看校验日志,确认脚本运行正常,避免脚本报错导致告警失效

内容的提问来源于stack exchange,提问作者alessio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:09:03