MySQL慢查询监控平台,可视化SQL性能
MySQL慢查询监控平台的核心作用是自动收集执行时间超过阈值的SQL语句,并用图表展示趋势,帮助运维和开发快速定位性能瓶颈。
本文从零开始,带你完成慢查询日志开启、监控组件部署、可视化看板配置,最终得到一个可用的SQL性能监控界面。
一、搭建前需要确认的环境与权限
开始操作前,请确保你有一台能连接MySQL的Linux服务器(CentOS 7/8或Ubuntu 20.04以上均可),并拥有root或sudo权限。
MySQL版本建议5.7或8.0,社区版即可。
需要准备以下组件:
- MySQL服务器:已运行,知道root密码或具备SUPER权限的账号。
- Prometheus:用于拉取监控数据。
- Grafana:用于可视化展示。
- mysqld_exporter:Prometheus官方提供的MySQL指标导出器。
如果你使用宝塔面板,可以在软件商店搜索“Prometheus”和“Grafana”快速安装,但本文以命令行手动部署为例,步骤更通用。
二、开启MySQL慢查询日志并验证
慢查询监控的第一步是让MySQL记录慢SQL。
登录MySQL后执行以下命令查看当前状态:
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';
如果slow_query_log为OFF,需要临时开启(重启失效):
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
要永久生效,请编辑MySQL配置文件(通常为/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]段落下添加:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
保存后重启MySQL:systemctl restart mysqld(或systemctl restart mysql)。
验证方法:执行一条SELECT SLEEP(2);,然后查看慢查询日志文件,如果出现该语句,说明配置生效。
注意日志文件路径的目录必须存在且MySQL用户有写入权限,否则会启动失败。
三、部署mysqld_exporter与Prometheus采集
mysqld_exporter负责将MySQL的慢查询计数等指标暴露给Prometheus。
先从官方GitHub releases页面下载对应版本的二进制包(根据你的系统架构选择),解压后创建MySQL监控用户:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'YourPassword';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
创建配置文件/etc/mysqld_exporter.cnf:
[client]
user=exporter
password=YourPassword
host=localhost
设置权限:chmod 600 /etc/mysqld_exporter.cnf。
启动exporter(假设二进制文件在/usr/local/bin/mysqld_exporter):
mysqld_exporter --config.my-cnf=/etc/mysqld_exporter.cnf &
默认监听9104端口,用curl http://localhost:9104/metrics能看到大量指标即成功。
接着配置Prometheus,编辑prometheus.yml,在scrape_configs下添加:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
重启Prometheus后,在Prometheus Web界面的“Status -> Targets”中应看到mysql任务为UP状态。
四、Grafana可视化看板与SQL性能图表
Grafana安装完成后,浏览器访问http://服务器IP:3000,默认账号密码均为admin。
首次登录会要求修改密码。
添加数据源:
点击左侧齿轮图标“Configuration -> Data Sources -> Add data source”,
选择Prometheus,
URL填写http:,
//localhost:
9090
保存并测试。
导入MySQL监控看板:在Grafana官网Dashboard页面搜索“MySQL Overview”或“MySQL Exporter”,复制看板ID(如7362)。
在Grafana中点击“+ -> Import”,输入ID并选择刚添加的Prometheus数据源,即可生成包含慢查询数量、QPS、连接数等图表的看板。
关键指标说明:
mysql_global_status_slow_queries:慢查询总数,持续上升说明存在性能问题。mysql_global_status_queries:总查询数,结合慢查询可计算慢查询比例。mysql_global_status_threads_connected:当前连接数,突增可能引发阻塞。
你可以根据业务需求,在Grafana中新建面板,用PromQL查询rate(mysql_global_status_slow_queries[5m])来观察慢查询增长速率。
五、避坑与效果验证
常见坑点:
- 慢查询日志路径权限错误:确保
/var/log/mysql目录存在且mysql用户可写。 long_query_time设置过小:如设为0会记录所有查询,导致日志膨胀和性能下降,建议从1秒开始逐步调整。- exporter用户权限不足:缺少PROCESS权限会导致部分指标无法采集。
- Prometheus无法拉取:检查防火墙是否开放9104端口,以及exporter是否在运行。
效果验证:
- 在MySQL中执行
SELECT SLEEP(3);,等待几秒后刷新Grafana看板,慢查询计数应增加。 - 查看Prometheus的Targets页面,mysql任务状态为UP。
- 在Grafana中调整时间范围,观察慢查询曲线是否与实际操作时间吻合。
如果验证通过,说明MySQL慢查询监控平台已正常工作。
后续可根据业务特点,在Grafana中增加告警规则,当慢查询速率超过阈值时触发通知。
常见疑问
慢查询日志会影响MySQL性能吗?
开启慢查询日志本身开销很小,但如果long_query_time设置过低,大量写入日志可能带来额外I/O压力。建议根据实际业务设定合理阈值,并定期轮转日志。
Grafana看板没有数据怎么办?
先检查Prometheus的Targets状态是否为UP,再确认数据源URL是否正确。如果Targets为DOWN,通常是exporter未启动或端口不通。
必须用Prometheus和Grafana吗?
不是必须,但这两个组合成熟且社区看板丰富。如果只想简单查看慢查询,也可以直接分析慢查询日志文件,但缺少趋势可视化。
慢查询监控平台能自动优化SQL吗?
不能。它只负责发现和展示问题,具体优化需要结合EXPLAIN分析、索引调整等手段人工处理。