navicat monitor无法记录执行慢查询的用户,仅聚合脱敏sql;需结合mysql的general_log或postgresql的pg_log定位操作人,并确保监控账号具备performance_schema或pg_stat_statements的足够权限。

Navicat Monitor 本身不记录“谁执行了慢查询”
它采集的是 performance_schema.events_statements_summary_by_digest(MySQL)或 pg_stat_statements(PostgreSQL)这类聚合视图,所有语句都已脱敏、标准化(如 SELECT * FROM users WHERE id = ?),原始 user 字段被丢弃。你看到的“前5个慢查询”里没有执行者信息,也查不到 IP、客户端名或会话启动时间。
必须配合数据库原生日志才能定位人
真正能锁定操作人的只有两类日志:
-
general_log(MySQL):开启后记录每条语句 +user@host,但性能开销极大,仅建议临时开启(SET GLOBAL general_log = ON)并搭配tail -f实时盯梢 -
pg_log(PostgreSQL):需在postgresql.conf中设log_statement = 'all'+log_connections = on,日志里含user=alice [local]和完整 SQL
Navicat Monitor 只能帮你发现“哪类查询耗时高”,比如 UPDATE orders SET status = ? WHERE created_at 总耗时飙升;但要确认是开发 A 在测试环境误跑了全表更新,还是运维 B 在凌晨执行了未加索引条件的清理脚本,必须翻上面的日志并按时间戳对齐。
用自定义指标 + 告警兜底识别异常行为
虽然不能直接标出用户名,但可通过行为模式间接预警:
- 建一个自定义指标,SQL 为:
SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT LIKE '%UPDATE%WHERE%' AND SUM_TIMER_WAIT > 3000000000000(即单条 UPDATE 耗时超 3 秒的频次) - 设告警阈值:1 分钟内该值 ≥ 5,触发邮件/钉钉通知
- 收到告警后,立刻去查
SHOW PROCESSLIST或pg_stat_activity,过滤Command = 'Query'+Time > 10的行,Info列里的 SQL 和User列就能对上人
这个组合拳的关键在于:Navicat Monitor 负责“发现异常模式”,数据库原生状态视图负责“当场抓人”。漏掉任何一环,就只剩猜。
团队协作时最容易忽略的权限陷阱
很多团队开了 Navicat Monitor 却收不到有效告警,原因往往是监控账号权限不足:
- MySQL 监控用户必须有
SELECT权限在performance_schema和information_schema,否则events_statements_summary_by_digest查不到数据,自定义指标永远返回空 - PostgreSQL 监控用户需
pg_read_all_data角色,或显式授权SELECTonpg_stat_statements,否则指标统计失效 - 如果用 SSH 隧道连接云数据库(如阿里云 RDS),还要确认隧道用户有
psql执行权限,且pg_stat_statements扩展已启用(CREATE EXTENSION IF NOT EXISTS pg_stat_statements)
权限不到位时,界面显示“查询分析器无数据”或“慢查询图表为空”,但不会报错提示——它默认你已配好底层权限。











