Prometheus监控SQL数据库核心是选对指标、稳定采集、看懂异常:需用对应exporter暴露指标,合理配置scrape参数,关注连接、复制、性能、资源类关键指标,并设置可干预的告警规则。

用Prometheus监控SQL数据库,核心是把数据库的运行指标暴露出来,再让Prometheus定时拉取、存储、告警。关键不在“装工具”,而在“选对指标+稳定采集+看懂异常”。
暴露数据库指标:不是所有库都自带 exporter
MySQL、PostgreSQL、SQL Server 等主流数据库本身不直接提供 HTTP 接口供 Prometheus 抓取。得靠官方或社区维护的 exporter 中转:
- MySQL:用 mysqld_exporter(推荐官方版本),需配置账号权限(至少有 PROCESS、REPLICATION CLIENT、SELECT 权限)
- PostgreSQL:用 postgres_exporter,支持自定义查询,可抓锁等待、慢查询、连接数等深度指标
- SQL Server:用 sqlserver_exporter,依赖 Windows Performance Counters 或 DMV 查询,注意 SQL Server Agent 不必开启,但需启用 TCP 协议和登录认证
- Oracle:没有官方 exporter,常用 oracledb_exporter(Go 编写)或通过定制脚本 + textfile collector 方式间接暴露
采集配置要稳:避免漏采、重复、超时
Prometheus 的 scrape 配置直接影响数据连续性和准确性:
-
job_name 命名建议带环境和实例标识,比如
mysql-prod-shard01,方便后续按标签过滤 - scrape_interval 别盲目设太短(如 5s)—— mysqld_exporter 单次采集可能耗时 200ms+,高频拉取易积压、触发超时;生产建议 30s~1m
- timeout 至少设为 scrape_interval 的 2/3,例如 interval=30s,timeout 可设 20s
- 多个实例别共用一个 job;用 static_configs 或 file_sd_configs 管理目标,后者更适合动态扩缩容场景
重点关注哪些指标?别只盯 CPU 和连接数
光看“是否活着”不够,要结合业务判断“是否健康”:
- 连接类:`mysql_global_status_threads_connected`(当前连接)、`mysql_global_status_aborted_connects`(失败连接突增 → 密码错/防火墙/爆库)
- 复制类(主从架构必看):`mysql_global_status_seconds_behind_master`(延迟秒数)、`mysql_slave_status_slave_sql_running`(SQL线程是否 running)
- 性能类:`mysql_global_status_slow_queries`(慢查累计)、`mysql_global_status_innodb_row_lock_time_avg`(行锁平均耗时)、`pg_stat_database_xact_rollback`(事务回滚率高 → 应用逻辑或死锁)
- 资源类:`mysql_global_variables_max_connections` vs `mysql_global_status_threads_connected`(连接使用率)、`pg_settings_effective_cache_size`(PostgreSQL 缓存配置是否合理)
告警不是越多越好:聚焦可干预、有业务影响的异常
以下规则适合大多数 OLTP 场景,用 PromQL 写在 Alertmanager 中:
- 主从延迟 > 60s 持续 3 分钟:
mysql_global_status_seconds_behind_master > 60 and on(instance) mysql_slave_status_slave_io_running == 1 - 连接数达上限 90%:
mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.9 - 慢查询 5 分钟内新增 ≥ 10 个:
rate(mysql_global_status_slow_queries[5m]) * 300 >= 10 - PostgreSQL 事务回滚率 > 5%:
rate(pg_stat_database_xact_rollback[5m]) / rate(pg_stat_database_xact_commit[5m] + pg_stat_database_xact_rollback[5m]) > 0.05
每条告警必须附带 处理指引,例如:“检查主库 binlog 是否写满”、“登录 DB 查 show processlist”、“联系应用确认是否有批量重试逻辑”。
不复杂但容易忽略:exporter 进程本身要加进程监控,数据库账号密码要用 Vault 或文件挂载方式管理,别硬编码在配置里。










