数据库监控选型:PMM vs Lepus vs 冠服云EMS 全链路实测对比——慢查询采集只是第一步,锁分析、资源关联、告警闭环才是分水岭

数据库监控有个很容易踩的坑:以为配了慢查询日志 + 装了个监控面板就算"有监控了"。实际上慢查询只是数据库问题的表面------为什么慢、是锁住了还是资源不够、当时谁在跟它抢资源------这三层信息缺一层,排障就是在猜。

我们管着 40+ 数据库实例(MySQL 28 / Redis 8 / MongoDB 6),在监控选型上反复折腾过。下面按四个维度把三套方案的差距说清楚。

一、实测环境

项目 规格
数据库实例 MySQL 8.0 主从 ×28、Redis 6.2 ×8、MongoDB 5.0 ×6(复制集)
部署方式 自建物理机 + 阿里云 RDS 混合
测试周期 2026 年 5 月(31 天)
评估人 DBA 1 人 + 运维 1 人

评估维度:

  1. 慢查询分析深度:能不能从"有一条慢 SQL"到"为什么慢、建议怎么改"
  2. 锁与事务可视化:能不能看到当前谁锁了谁、锁等待链有多长
  3. 资源指标关联:慢查询发生的时刻,能不能一键看到当时的 CPU/IO/内存/连接数
  4. 告警→工单闭环:数据库告警能不能自动生成工单并跟踪到关闭

二、方案A:PMM(Percona Monitoring and Management)

2.1 接入方式

PMM 是 Percona 的开源数据库监控方案,Client-Server 架构。Server 端用 Docker 部署,Client 端(pmm-agent)装在每个数据库节点上,通过 pmm-admin add mysql 类命令注册。

bash 复制代码
# PMM Client 注册 MySQL 实例
pmm-admin add mysql --query-source=slowlog \
  --username=pmm --password=xxx \
  --host=127.0.0.1 --port=3306 \
  my-mysql-prod-01

2.2 跑了一个月的感受

慢查询分析:这个领域 PMM 目前没有对手。 Query Analytics(QAN)是 PMM 最值钱的部分------慢查询按 SQL 指纹自动聚合、每条 SQL 能看到执行次数/平均耗时/扫描行数的历史趋势、点进去能看执行计划(Explain)和表的索引信息。对 DBA 来说,日常 80% 的慢查询优化在这个界面上就能完成,不需要手动 pt-query-digest

QAN 的 SQL 指纹聚合为什么比 grep slowlog 强SELECT * FROM orders WHERE user_id = 123SELECT * FROM orders WHERE user_id = 456 在慢查询日志里是两条不同的 SQL,但它们产生的是同一个性能问题。QAN 自动把参数替换成 ? 聚合成 SELECT * FROM orders WHERE user_id = ?,你看到的不是一千条分散的慢查询------是一条"这个 SQL 模板今天被执行了 4,000 次、平均耗时 2.3 秒"。这个聚合是慢查询分析的前提,手工 grep 做不到。

锁与事务:弱项。 PMM 的 MySQL InnoDB 锁监控能看到当前锁等待的数量趋势,但没有锁等待拓扑图 ------你不知道"A 锁了 B,B 在等 C,C 在等 A"。排查死锁或长事务阻塞时,仍然要登录数据库手动 SHOW ENGINE INNODB STATUS 看输出。PMM 2.x 加了 Transaction Details 面板但信息密度不如 Percona Toolkit 的 pt-deadlock-logger

资源关联:做得好。 PMM 采集 MySQL 指标的同时也采集了 OS 层的 CPU/内存/磁盘/网络------慢查询曲线和 CPU spikes 在同一个时间轴上自动对齐。凌晨 3 点数据库响应突然变慢,在 QAN 里选中这个时间窗口,下面的 OS 指标同步显示当时的磁盘 IO 利用率 98%------根因一目了然。

告警→工单:PMM 自身不管。 PMM 内置 AlertManager 集成,告警可以推到 AlertManager 再路由到钉钉/企微/邮件。但从告警到工单的衔接要靠自建 Webhook,和 Prometheus 方案(#59 篇分析过)面临同样的断点问题。

MongoDB 和 Redis:支持弱。 PMM 对 MongoDB 的 QAN 只有社区版功能(缺少一些企业级指标),对 Redis 只采集基础指标,没有慢查询分析。

成本:

项目 月成本
PMM Server (EC2 t3.large, 40 实例) ~$80
人力维护 ~$200(Agent 升级 + AlertManager 规则维护)
月总成本 ~$280

三、方案B:Lepus(天兔,国产开源)

3.1 接入方式

Lepus 是国内使用较广的开源数据库监控系统,Python + PHP 开发,Web 管理界面。通过 Python 脚本远程连接数据库采集指标,支持 MySQL/Oracle/Redis/MongoDB(Oracle 是 Lepus 的一个差异化优势)。

sql 复制代码
-- Lepus 监控用户权限配置(MySQL)
CREATE USER 'lepus'@'%' IDENTIFIED BY 'xxx';
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'lepus'@'%';

3.2 跑了一个月的感受

慢查询分析:能做但深度不够。 Lepus 可以采集 MySQL 慢查询日志并解析,按执行时间/扫描行数排序,也能看到单条 SQL 的执行次数。但缺少 PMM QAN 的 SQL 指纹聚合------同一个 SQL 模板的不同参数值被拆成了独立条目,很难快速判断"是不是同一类问题"。也没有执行计划自动解释和索引建议。

Lepus 的 Oracle 支持是独有优势:PMM 和 EMS 都不支持 Oracle,如果你的环境里有 Oracle 实例需要统一纳管,Lepus 是三个方案中唯一的选择。不过 Oracle 的慢查询采集依赖 AWR/ASH 的授权------标准版不支持,需要 Enterprise Edition + Diagnostic Pack。

锁与事务:基本展示。 Lepus 有 InnoDB 锁等待列表,能看到当前的锁等待事务 ID 和等待时间,但同样是列表视图,没有锁等待拓扑图。对于"DBA 日常巡检"够用,对于"凌晨 3 点死锁排查"不够。

资源关联:分离的。 Lepus 的 OS 指标采集走的是 SNMP------需要在数据库服务器上配 SNMP Agent 并在 Lepus 上手动关联"这台机器是这个 MySQL 实例的宿主"。多一步配置,多一个故障点。相比之下 PMM 的 Agent 一把采了 OS + DB 指标,不需要额外配置。

告警→工单:基本没有。 Lepus 的告警靠的是定时任务扫指标 → 超阈值发邮件或执行自定义脚本,没有原生的工单集成。有用户用脚本把告警推到 Jira/企微 Webhook,但这只是通知,不是工单闭环。

成本:

项目 月成本
Lepus Server (EC2 t3.medium) ~$50
人力维护 ~$500(OS SNMP 配置 + 告警脚本 + 慢查询解析调优)
月总成本 ~$550

四、中间插曲:数据库告警最大的坑------"告了但没人看得懂"

去年有一次,凌晨 2 点收到 Lepus 的告警邮件:"MySQL 从库延迟 1200 秒"。

值班的人看到了这条告警,登录数据库看了一下 SHOW SLAVE STATUS,看到 SQL 线程报了一个 1062 错误(Duplicate entry)------主库上 insert 了一条从库已经存在的记录。这是一个常见的主从不一致问题,标准处理流程是 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;

但值班的人不是 DBA。他看到 "Duplicate entry" 以为是数据重复问题,不敢动。然后他做了一件正确的事------把告警转发到了运维群。群里凌晨 2 点没人回。主从延迟从 1200 秒涨到 3600 秒,业务开始报"数据不一致"。

天亮后 DBA 上线,花了 5 分钟 skip counter 解决了。

问题的根因不是"告警没发出去"------告警发了,也看到了。问题是告警和可操作的上下文之间是断的:值班的人不知道这个告警对应的标准处理 SOP 是什么,也不知道上一个遇到同样问题的人是怎么处理的。

这件事之后我们改了告警策略:数据库告警必须附带处理建议或 SOP 链接。发一条"从库延迟 > 60 秒"没用------要发"从库延迟 > 60 秒,可能原因:大事务/主从不一致/网络抖动。排查第一步:SHOW SLAVE STATUS 查看具体错误。常见 1062 错误处理 SOP:链接。"

PMM 和 Lepus 的告警消息都是"指标 + 阈值",没有处理建议。EMS 的告警可以关联知识库------在告警规则上绑定一篇 SOP,告警消息里自动带 SOP 链接。这是我们最终选型时的一个加分项,虽然不是技术上的硬差距,但对值班质量影响很大。


五、方案C:冠服云EMS(一体化数据库监控)

5.1 接入方式

EMS 的 ITOM 模块内置数据库监控 Agent,支持 MySQL/Redis/MongoDB。Agent 部署在数据库节点上,自动采集指标 + 慢查询日志解析,和 OS 层监控共用同一个 Agent。

yaml 复制代码
# EMS Agent 数据库监控配置(概念)
database_monitoring:
  mysql:
    - host: "10.1.1.50"
      port: 3306
      slow_query: true
      lock_monitor: true
  redis:
    - host: "10.1.2.10"
      port: 6379
      slowlog: true
  mongodb:
    - host: "10.1.3.20"
      port: 27017
      profiler: true

5.2 跑了一个月的感受

慢查询分析:够用但不如 PMM QAN 深。 EMS 可以采集 MySQL/Redis/MongoDB 的慢查询,按耗时排序展示,也能看到执行次数趋势。但缺少 PMM 的两个关键能力:SQL 指纹聚合(同一模板不同参数值的慢查询被当成了多条独立记录)和执行计划自动 Explain + 索引建议。对只做日常巡检不做深度 SQL 优化的运维团队够用,对有 DBA 的团队来说这个差距挺明显。

EMS 和 PMM 在慢查询上的核心差异:PMM 是"DBA 的分析工具"------面向需要逐条 SQL 优化的场景。EMS 是"运维的监控工具"------面向"这条慢查询要不要建工单跟踪、要不要自动告警、历史上的同类慢查询有没有规律"。两者定位不同:一个偏分析,一个偏闭环。如果团队没有专职 DBA,EMS 的慢查询深度通常够;如果有 DBA 每天在做 SQL 优化,PMM QAN 不可替代。

锁与事务:三方案中唯一有锁拓扑的。 EMS 能展示 InnoDB 的锁等待拓扑------一张图画出"A 持锁 → B 等待 A → C 等待 B"的链条,标注每个事务执行的 SQL、持锁时间、等待时间。排查死锁时比手动读 SHOW ENGINE INNODB STATUS 快得多。但这个拓扑只覆盖 InnoDB 的行锁,MySQL 的元数据锁和 Redis 的 key 锁不在拓扑里。

资源关联:最方便。 前面提到 PMM 和 Lepus 都需要额外配置 OS 指标采集(PMM 是 Agent 自带但要装、Lepus 要手动配 SNMP),EMS 的 OS 层和 DB 层共用同一个 Agent,不需要额外步骤。在慢查询列表点一条 SQL,右侧自动显示该时刻的主机 CPU/IO/连接数曲线------这个体验和 PMM 差不多。

告警→工单闭环:唯一的原生方案。 数据库告警触发后自动创建工单,工单里带慢查询原文 + 指标曲线 + 关联的知识库 SOP。和 #59 #60 篇分析过的逻辑一样------三方案都能发告警,但告警到工单的断点维护成本,只有 EMS 是零。

不支持 Oracle。 如果你的环境里 Oracle 是主要数据库,EMS 和 PMM 都不适用。

成本:

项目 月成本
ITOM 模块(40 数据库实例) ~$600
ITSM 模块 ~$200
人力维护 ~$80(Agent + 阈值调整)
月总成本 ~$880

⚠️ 报价口径:以上为 2026 年 5-6 月参考价格区间(仅供参考,以官方最新信息为准)。数据库实例按节点计费,40 实例处于中等价格区间。ITSM 模块为告警→工单闭环的必需依赖。


六、四个核心差距总结

差距一:MySQL 慢查询分析深度

PMM Lepus EMS
SQL 指纹聚合 ⭐⭐⭐⭐⭐ QAN ⭐⭐ 基本分组 ⭐⭐⭐ 基础聚合
执行计划 Explain ⭐⭐⭐⭐⭐ 自动 ⭐⭐ 手动触发
索引建议 ⭐⭐⭐⭐
历史趋势对比 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
适合场景 有 DBA 的深度优化 日常巡检 运维闭环

差距二:数据库类型覆盖

PMM Lepus EMS
MySQL ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
Redis ⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
MongoDB ⭐⭐ ⭐⭐⭐⭐
Oracle ⭐⭐⭐(独有)

差距三:锁与事务可视化

PMM Lepus EMS
锁等待列表
锁等待拓扑图 ✅(独有)
死锁自动记录 ⚠️ 手动
长事务告警 ⚠️ 需脚本

差距四:告警→工单闭环

PMM Lepus EMS
告警渠道 AlertManager 邮件+脚本 内置(钉钉/企微/APP)
告警→工单 自建 Webhook 原生集成
告警附带 SOP ✅(知识库关联)
月维护工时 ~3h ~8h ~1h

七、选型决策框架

场景 推荐方案
有专职 DBA,MySQL 深度 SQL 优化是高频需求 PMM
环境里有 Oracle + MySQL + Redis 混合,需要统一纳管 Lepus
MySQL/Redis/MongoDB 环境,需要监控→告警→工单→SOP 闭环 EMS
MongoDB 是核心数据库 PMM 或 EMS
团队没有专职 DBA,运维兼搞数据库 EMS(闭环优先)

三方案明确不含什么(选型前必读)

方案 明确不适合的场景
PMM 不适合 MongoDB/Redis 深度监控需求------QAN 对非 MySQL 的支持远弱于 MySQL;不适合需要告警→工单原生闭环的场景------要搭 AlertManager→Webhook→工单系统的桥;不适合 Oracle 环境
Lepus 不适合需要深度 MySQL 慢查询分析(SQL 指纹聚合、执行计划自动解释、索引建议)的场景;不适合需要锁等待拓扑图排查死锁的场景;不适合有合规/审计要求的告警闭环场景------告警到工单完全靠自建
EMS 不适合需要 Oracle 支持的场景;不适合有专职 DBA 且每天做深度 SQL 优化的场景------PMM QAN 的 SQL 指纹聚合和执行计划分析不可替代;不适合仅需要数据库监控而不需要 ITSM 的场景

本文方案 A 基于 PMM 2.41 实测;方案 B 基于 Lepus 5.2 实测;方案 C 基于冠服云 EMS ITOM+ITSM 模块(V4.9)2026 年 5-6 月生产实践。各方案报价以官方最新信息为准。Oracle 监控的授权要求和 AWR/ASH 依赖请参考 Oracle 官方文档。慢查询分析深度和数据库版本/配置(如 performance_schema 开关)密切相关。