Prometheus 監(jiān)控 MySQL 告警規(guī)則
說明:mysqld_exporter 采集上來的指標(biāo),配合 Prometheus 告警規(guī)則,可以實(shí)現(xiàn)對(duì) MySQL 數(shù)據(jù)庫的全面監(jiān)控。下面按嚴(yán)重級(jí)別歸類整理。
寫在前面
MySQL 的告警指標(biāo)主要涉及三個(gè)方面:
- 數(shù)據(jù)庫可用性:MySQL 是否活著、主從復(fù)制是否正常
- 性能與配置:連接數(shù)、InnoDB 狀態(tài)、日志配置、緩存大小
- 容量:磁盤空間、打開文件數(shù)
告警分三個(gè)級(jí)別:
| 級(jí)別 | 含義 | 處理方式 |
|---|---|---|
| 嚴(yán)重告警 | 立即需要處理 | 線上問題,隨時(shí)可能影響業(yè)務(wù) |
| 警告 | 需要關(guān)注 | 潛在風(fēng)險(xiǎn),不處理可能升級(jí) |
| 提示 | 備案 | 記錄但不一定告警 |
嚴(yán)重告警(Critical)
MySQL 實(shí)例宕機(jī)
- alert: MySQL 服務(wù)宕機(jī)
expr: mysql_up == 0
for: 1m
labels:
severity: 嚴(yán)重告警
annotations:
summary: "MySQL {{ $labels.instance }} 宕機(jī)"
description: "MySQL 數(shù)據(jù)庫無法連接"主從復(fù)制 IO 線程停止
- alert: MySQL 復(fù)制 IO 線程異常
expr: mysql_slave_status_slave_io_running != 1
for: 1m
labels:
severity: 嚴(yán)重告警
annotations:
summary: "主從復(fù)制 IO 線程停止"
description: "從庫無法連接主庫,復(fù)制中斷"IO 線程停了,說明從庫連不上主庫。常見原因:網(wǎng)絡(luò)不通、主庫宕機(jī)、復(fù)制賬號(hào)密碼不對(duì)。
主從復(fù)制 SQL 線程停止
- alert: MySQL 復(fù)制 SQL 線程異常
expr: mysql_slave_status_slave_sql_running != 1
for: 1m
labels:
severity: 嚴(yán)重告警
annotations:
summary: "主從復(fù)制 SQL 線程停止"
description: "從庫無法應(yīng)用 relay log,復(fù)制中斷"SQL 線程停了,說明從庫在執(zhí)行主庫傳過來的 SQL 時(shí)出了問題。常見原因:表結(jié)構(gòu)沖突、主鍵沖突、磁盤滿。
主從復(fù)制延遲
- alert: MySQL 主從復(fù)制延遲
expr: mysql_slave_status_seconds_behind_master > 30
for: 1m
labels:
severity: 嚴(yán)重告警
annotations:
summary: "主從復(fù)制延遲"
description: "從庫落后主庫 {{ $value }} 秒"警告(Warning)
連接數(shù)超過 80%
- alert: MySQL 連接數(shù)告警
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 80
for: 1m
labels:
severity: 警告
annotations:
summary: "MySQL 連接數(shù)過高"
description: "當(dāng)前連接 {{ $value }}%,超過最大連接數(shù)的 80%"如果這個(gè)值不斷上漲,說明應(yīng)用端連接沒有及時(shí)釋放,或者連接池配置過大。
打開文件數(shù)超過 75%
- alert: MySQL 打開文件數(shù)過多
expr: mysql_global_status_innodb_num_open_files > mysql_global_variables_open_files_limit * 0.75
for: 1m
labels:
severity: 警告
annotations:
summary: "InnoDB 打開文件數(shù)過高"
description: "已用文件數(shù)超過限制的 75%,建議增大 open_files_limit"InnoDB 日志文件太小
- alert: InnoDB 日志文件過小
expr: mysql_global_variables_innodb_log_file_size < 16777216
for: 1m
labels:
severity: 警告
annotations:
summary: "InnoDB 日志文件太小"
description: "當(dāng)前 ib_logfile 小于 16MB,影響寫入性能"InnoDB 的 redo log (ib_logfile)太小,會(huì)導(dǎo)致日志頻繁切換,觸發(fā)檢查點(diǎn)(checkpoint),影響寫入性能。生產(chǎn)環(huán)境建議 1GB 以上。
排序緩沖區(qū)配置不合理
- alert: 排序緩沖區(qū)配置錯(cuò)誤
expr: mysql_global_variables_innodb_sort_buffer_size < 262144 or mysql_global_variables_read_buffer_size > 4194304
for: 1m
labels:
severity: 警告
annotations:
summary: "排序緩沖區(qū)配置不合理"
description: "建議 innodb_sort_buffer_size 不低于 256KB,read_buffer_size 不超過 4MB"最大連接數(shù)使用率過高
- alert: 最大連接數(shù)使用率過高
expr: mysql_global_status_max_used_connections > mysql_global_variables_max_connections * 0.8
for: 1m
labels:
severity: 警告
annotations:
summary: "最大連接數(shù)使用率過高"
description: "歷史上最多同時(shí)使用了 {{ $value }} 的可用連接數(shù)"這個(gè)指標(biāo)跟 threads_connected 不同,它記錄的是歷史上同時(shí)連接的最大值。如果超過了 80%,說明你的 max_connections 可能設(shè)小了。
二進(jìn)制日志未開啟
- alert: 二進(jìn)制日志未開啟
expr: mysql_global_variables_log_bin != 1
for: 1m
labels:
severity: 警告
annotations:
summary: "二進(jìn)制日志未開啟"
description: "log_bin 未開啟,無法進(jìn)行基于時(shí)間點(diǎn)的恢復(fù)(PITR)"生產(chǎn)環(huán)境強(qiáng)烈建議開啟 binlog。如果沒有 binlog,誤刪數(shù)據(jù)后只能從全量備份恢復(fù),丟失最近一段時(shí)間的全部數(shù)據(jù)。
InnoDB 刷新策略不安全
- alert: InnoDB 刷新策略不安全
expr: mysql_global_variables_innodb_flush_log_at_trx_commit != 1
for: 1m
labels:
severity: 警告
annotations:
summary: "InnoDB 日志刷新策略可能丟數(shù)據(jù)"
description: "innodb_flush_log_at_trx_commit 當(dāng)前值為 {{ $value }},非 1 的情況下斷電可能丟已提交事務(wù)"innodb_flush_log_at_trx_commit=1 性能最差但最安全,每次提交都刷盤。如果是銀行、支付類業(yè)務(wù),建議設(shè)置為 1。
需要關(guān)注(Page / Info)
表定義緩存太小
- alert: 表定義緩存太小
expr: mysql_global_status_open_table_definitions > mysql_global_variables_table_definition_cache
for: 1m
labels:
severity: 警告
annotations:
summary: "表定義緩存不足"
description: "打開的表的數(shù)量已超過 cache 限制,建議增大 table_definition_cache"表打開緩存太小
- alert: 表打開緩存太小
expr: mysql_global_status_open_tables > mysql_global_variables_table_open_cache * 0.99
for: 1m
labels:
severity: 警告
annotations:
summary: "表打開緩存不足"
description: "table_open_cache 幾乎滿,建議增大"從庫未設(shè)置只讀
- alert: 從庫未設(shè)置為只讀
expr: mysql_global_variables_read_only == 0
for: 1m
labels:
severity: 警告
annotations:
summary: "從庫未開啟 read_only"
description: "從庫不是只讀模式,可能發(fā)生數(shù)據(jù)誤寫導(dǎo)致主從不一致"Binlog 緩存大小可能太小
- alert: Binlog 緩存過小
expr: mysql_global_variables_binlog_cache_size < 1048576
for: 1m
labels:
severity: 警告
annotations:
summary: "Binlog 緩存過小"
description: "當(dāng)前 binlog_cache_size 小于 1MB,建議增大"告警規(guī)則使用建議
先測(cè)試再上線:把規(guī)則加到 Prometheus 后,在 Alerts 頁面觀察一段時(shí)間,確認(rèn)不會(huì)誤報(bào)再正式啟用 Alertmanager 通知。
分級(jí)通知:嚴(yán)重告警走電話/短信,警告走郵件/釘釘/企微,提示級(jí)別可以只在告警頁面展示。
調(diào)整閾值:
- 連接數(shù) 80% → 如果業(yè)務(wù)流量波動(dòng)大,可以調(diào)到 85% 或 90%
- 復(fù)制延遲 30 秒 → 如果業(yè)務(wù)對(duì)延遲不敏感,可以調(diào)到 120 秒
- InnoDB 日志 16MB → 生產(chǎn)環(huán)境建議 1GB 起步,這里的告警閾值主要用來發(fā)現(xiàn)配置過于保守的情況
搭配 mysqld_exporter:這些規(guī)則的指標(biāo)全部來自 mysqld_exporter,確認(rèn) exporter 版本支持后再啟用規(guī)則。部分指標(biāo)在低版本 exporter 中不存在。
到此這篇關(guān)于Prometheus 監(jiān)控 MySQL 告警規(guī)則的文章就介紹到這了,更多相關(guān)Prometheus 監(jiān)控 MySQL 告警內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)
最近碰到一個(gè)需求是統(tǒng)計(jì)某張表的數(shù)據(jù),統(tǒng)計(jì)時(shí)間維度為近一年,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
MySQL使用xtrabackup進(jìn)行備份還原操作
這篇文章主要為大家詳細(xì)介紹了MySQL如何使用xtrabackup進(jìn)行備份還原操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
MySQL中行級(jí)鎖和表級(jí)鎖的區(qū)別小結(jié)
MySQL中的行級(jí)鎖和表級(jí)鎖是兩種不同的鎖機(jī)制,它們?cè)诓l(fā)控制和鎖粒度方面有顯著的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Linux下指定mysql數(shù)據(jù)庫數(shù)據(jù)配置主主同步的實(shí)例
Linux下指定數(shù)據(jù)庫數(shù)據(jù)配置主主同步的實(shí)例,有需要的朋友可以參考下2013-01-01
MySQL 8.0.20 安裝教程圖文詳解(windows 64位)
這篇文章主要介紹了MySQL 8.0.20安裝教程(windows 64位),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有,需要的朋友可以參考下2020-05-05
MySQL存儲(chǔ)過程全面解析以及和Java的類比教程
存儲(chǔ)過程是一種在MySQL數(shù)據(jù)庫中定義和執(zhí)行的可重復(fù)使用的程序單元,它允許我們將一系列的 SQL 語句組織在一起,并通過一個(gè)簡(jiǎn)單的調(diào)用來執(zhí)行它們,這篇文章主要介紹了MySQL存儲(chǔ)過程全面解析以及和Java類比的相關(guān)資料,需要的朋友可以參考下2025-09-09

