原生 mysqld_exporter 不感知备份任务,需自定义采集器暴露 backup_status 指标:通过原子化标记文件(如 /backup/latest/OK)生成 mysql_backup_last_success_seconds_ago 和 mysql_backup_last_duration_seconds,并配置双维度告警与 Grafana 多组件面板。

原生 mysqld_exporter 根本不感知备份任务
它只连 MySQL 实例执行 SHOW STATUS、SELECT FROM performance_schema 这类查询,完全不知道你用的是 xtrabackup 还是 mysqldump,更不会读退出码、看日志或检查标记文件。所以直接在 Prometheus 里查 mysql_up 或 mysql_global_status_uptime,哪怕备份脚本已失败卡死一小时,指标照样显示“正常”。
常见误配包括:
- 用
node_exporter监控备份目录mtime—— 无法区分“刚 touch 了开始标记”和“真正完成并校验成功” - 把
xtrabackup日志塞进 Loki 再做关键词匹配 —— 告警延迟高、无时间戳对齐、没法直接关联 Prometheus 的ALERTS标签 - 在 Grafana 里写 PromQL 查
mysql_slave_status_seconds_behind_master—— 这是主从延迟,和备份成功率毫无关系
必须自己暴露 backup_status 指标
核心动作就两步:在备份脚本末尾写原子化标记文件(如 /backup/latest/OK),再让一个轻量采集器定期读它并转成 Prometheus 指标。推荐复用 mysqld_exporter 框架新增 collector,而非另起服务——避免多维护一套二进制和配置。
关键实现点:
- 标记文件必须原子写入:
echo "1693987200" > /tmp/backup.tmp && mv /tmp/backup.tmp /backup/latest/OK,防止采集器读到中间态 - 暴露两个指标:
mysql_backup_last_success_seconds_ago(距上次成功多少秒,Gauge)、mysql_backup_last_duration_seconds(上次耗时,Histogram) - 采集器需支持自定义路径参数,例如
--backup.status-file="/backup/latest/OK" --backup.duration-file="/backup/latest/DURATION" - 若用 Go 复写 collector,注意用
os.Stat()读文件修改时间,别用cat解析内容——避免权限或格式错误导致 panic
告警规则要同时判断时效性与状态
只看“是否成功”不够:一次成功但距今已超 24 小时,和一次失败但刚发生,风险等级完全不同。必须双维度组合。
典型告警配置(alert.rules.yml):
-
mysql_backup_failed:mysql_backup_last_success_seconds_ago == 0,表示从未成功过或最后一次失败(OK文件不存在) -
mysql_backup_stale:mysql_backup_last_success_seconds_ago > 86400,表示最近 24 小时无成功记录 -
mysql_backup_too_slow:mysql_backup_last_duration_seconds_bucket{le="7200"} == 0,表示最近一次耗时超过 2 小时(直方图上le="7200"桶为 0)
注意:不要用 absent() 判断指标缺失——采集器 crash 和备份失败是两类问题,得分开告警。
Grafana 面板要显示“最后成功时间 + 耗时趋势 + 状态开关”
单靠数字面板容易忽略上下文。建议三个基础组件并排:
- 一个
Stat面板,表达式:time() - mysql_backup_last_success_seconds_ago,格式设为 “YYYY-MM-DD HH:mm”,直观显示最后成功时刻 - 一个
Time series面板,查mysql_backup_last_duration_seconds_sum / mysql_backup_last_duration_seconds_count,看耗时均值变化趋势 - 一个
State timeline面板,用mysql_backup_last_success_seconds_ago > 0生成布尔序列,绿色=健康,红色=失败或超时
所有面板加 instance 标签变量,方便切换不同 MySQL 实例。别漏掉给 mysql_backup_last_success_seconds_ago 设置非负校验——采集器若读错文件,可能返回负数,会污染整个告警链路。


















