如何实现主库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 校验脚本编写
脚本逻辑如下:
- 预定义主从库连接信息、告警收件人、日志路径等配置项
- 分别查询主库当前
gtid_binlog_pos(已提交的GTID集合)、从库当前gtid_slave_pos(已执行的GTID集合) - 调用MariaDB原生函数
GTID_SUBSET()判断主库GTID是否是从库GTID的子集,返回0则代表主从GTID不一致 - 不一致时拼装告警内容发送邮件,同时记录每次校验的日志便于排查
- 清理临时产生的中间文件
示例脚本(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
相关产品推荐
相关产品推荐

