MySQL数据库运行状态监控实战
网站响应变慢时,可以先观察数据库连接数、查询量和慢查询是否发生变化,再结合其他监控结果缩小排查范围。本次通过mysqld_exporter采集MySQL指标,接入Prometheus,并在Grafana中集中展示数据库运行状态。
一、监控目标
本次重点监控以下内容:
- 数据库是否能够被正常采集
- 当前连接数
- 查询速率QPS
- 慢查询速率
- 连接创建速率
连接数与查询量用于观察负载变化,慢查询计数用于发现超过指定执行时间的查询。这些指标需要结合业务情况分析,不能单凭某一项数值判断数据库存在故障。
二、组件版本
本次环境记录的组件版本如下:
MySQL Server 8.0.46
prometheus-mysqld-exporter 0.15.0-2ubuntu0.24.04.3
以下步骤按MySQL与Exporter部署在同一台Ubuntu服务器上编写,使用本地Unix Socket连接数据库。
三、安装组件
以下系统命令以root身份执行:
apt-get update
apt-get install -y mysql-server prometheus-mysqld-exporter
如果服务器已经安装并运行MySQL,只安装Exporter即可,不要重复安装或替换现有数据库。
检查服务和版本:
systemctl is-active mysql prometheus-mysqld-exporter
mysql --version
安装后先完成监控账号与连接配置,再判断采集是否正常。Exporter服务运行与数据库采集成功是两个不同的检查环节。
四、创建监控用户
1. 确认Socket认证条件
本次使用MySQL的auth_socket认证,避免在Exporter配置文件中保存数据库密码。
Socket认证需要匹配操作系统用户身份,不能只创建一个同名数据库账号就结束配置。 本例要求Exporter以系统用户prometheus运行,并通过Unix Socket连接数据库。
检查服务运行用户:
systemctl show prometheus-mysqld-exporter -p User -p Group
如果User不是prometheus,应根据实际服务用户调整认证配置,不要直接照搬后续账号设置。
使用数据库管理员身份登录MySQL,检查插件和Socket路径:
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'auth_socket';
SHOW VARIABLES LIKE 'socket';
后续步骤要求auth_socket已经启用。本教程针对MySQL,不应直接将其他数据库的unix_socket插件名替换进来使用。
2. 创建专用监控账号
在确认该账号尚不存在的情况下执行:
CREATE USER 'prometheus'@'localhost'
IDENTIFIED WITH auth_socket
WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT
ON *.* TO 'prometheus'@'localhost';
这组权限用于Exporter采集,并限制监控账号的并发连接数。SELECT ON *.*的读取范围较广,应将账号专用于监控,后续可结合实际启用的采集器评估权限范围。
如果账号已经存在,先检查,不要直接删除重建:
SHOW CREATE USER 'prometheus'@'localhost';
SHOW GRANTS FOR 'prometheus'@'localhost';
确认Exporter系统用户为prometheus后,可以在服务器终端验证认证:
sudo -u prometheus mysql \
--protocol=SOCKET \
--socket=/run/mysqld/mysqld.sock \
-u prometheus \
-e "SELECT CURRENT_USER();"
其中Socket路径应与数据库实际配置一致。
五、配置mysqld_exporter
创建配置文件:
nano /etc/prometheus/mysql-exporter.cnf
写入:
[client]
user=prometheus
socket=/run/mysqld/mysqld.sock
Exporter支持从指定配置文件读取用户和Socket连接参数。确保服务运行用户能够读取该文件。
本次安装方式使用以下默认参数文件:
/etc/default/prometheus-mysqld-exporter
编辑其中的ARGS,不要保留多个相互冲突的赋值:
ARGS="--config.my-cnf=/etc/prometheus/mysql-exporter.cnf --web.listen-address=127.0.0.1:9104"
这里将指标接口限制在本机。如果Prometheus部署在另一台服务器,需要改为可达的监听地址,并限制允许访问的来源。
重启服务:
systemctl reset-failed prometheus-mysqld-exporter
systemctl restart prometheus-mysqld-exporter
systemctl status prometheus-mysqld-exporter
如果修改后没有生效,检查实际服务启动配置是否读取上述参数文件:
systemctl cat prometheus-mysqld-exporter
六、验证metrics
访问Exporter指标接口:
curl -sS http://127.0.0.1:9104/metrics \
| grep -E '^mysql_up|^mysql_global_status_threads_connected|^mysql_global_status_queries'
重点检查:
mysql_up 1
同时确认存在连接数和查询计数指标。mysql_up为1表示Exporter能够连接数据库;仅看到指标名称或HTTP接口能够访问,还不足以认定数据库采集正常。
七、Prometheus配置
在已有的scrape_configs列表下添加任务,不要覆盖其他采集配置:
- job_name: mysql
static_configs:
- targets:
- localhost:9104
校验配置:
promtool check config /etc/prometheus/prometheus.yml
校验通过后重启Prometheus:
systemctl restart prometheus
进入Targets页面,检查mysql任务是否为UP。

再查询:
mysql_up{job="mysql"}

需要区分两个状态:
up{job="mysql"}:Prometheus是否成功抓取Exporter。mysql_up{job="mysql"}:Exporter是否能够连接MySQL。
因此,Targets为UP后,还需要继续确认mysql_up为1。
八、常用PromQL
1. MySQL采集状态
mysql_up{job="mysql"}
用于检查数据库连接是否成功。它不代表所有业务SQL都能正常执行。
2. 当前连接数
mysql_global_status_threads_connected{job="mysql"}
反映当前打开的连接数量,其中可能包含空闲连接,并不等同于正在执行查询的数量。
3. 查询速率QPS
rate(mysql_global_status_queries{job="mysql"}[5m])
根据累计查询计数计算最近5分钟的平均每秒查询量。该计数并非只统计业务请求,也不能直接等同于网站访问量。
4. 慢查询速率
rate(mysql_global_status_slow_queries{job="mysql"}[5m])
用于观察慢查询计数的增长速度。判断时应同时核对long_query_time设置;慢查询计数与是否开启慢查询日志不是同一件事。
5. 连接创建速率
rate(mysql_global_status_connections{job="mysql"}[5m])
该指标对应连接尝试次数的增长速率,包含成功和失败的连接尝试,因此不能理解为“成功建立连接数”。
九、Grafana看板
将上述查询添加到Grafana面板,集中展示MySQL运行状态。

建议将在线状态、当前连接数、QPS、慢查询速率和连接尝试速率放在同一看板中。排查网站响应变慢的问题时,统一时间范围,再对照服务器资源、网站请求量和数据库日志进行分析。
十、常见问题
1. Exporter服务启动失败
查看日志:
journalctl -u prometheus-mysqld-exporter --no-pager -n 100
如果出现no user specified,检查配置文件中是否包含有效的user,以及--config.my-cnf是否指向正确文件。也要确认服务用户具备读取权限。
2. 提示Access denied
优先核对:
- Exporter实际使用的系统用户
- 数据库监控账号的认证插件
- 是否通过Unix Socket连接
- Socket路径是否正确
- 监控账号是否具有所需权限
本例的无密码认证依赖系统用户身份,不能改成TCP连接后仍按相同方式使用。
3. Prometheus中的mysql任务为DOWN
先检查Exporter及其指标接口:
systemctl status prometheus-mysqld-exporter
curl http://127.0.0.1:9104/metrics
再核对Prometheus的目标地址和网络可达性。DOWN表示抓取失败,应先排查Prometheus到Exporter这一段。
如果Targets为UP但mysql_up为0,再检查MySQL服务、认证与连接配置:
systemctl status mysql
journalctl -u prometheus-mysqld-exporter --no-pager -n 100
十一、总结
MySQL基础监控可以先覆盖采集状态、连接数、查询速率和慢查询变化,再根据实际故障补充更细的指标。连接数或QPS升高并不必然意味着异常,判断时需要结合业务负载与查询表现。
配置完成后,建议先记录正常运行时的指标范围,再以此为依据设置告警,避免直接套用不适合当前网站的固定阈值。