mysqld_exporter不是开箱即用工具,必须正确配置MySQL监控账号权限(PROCESS、REPLICATION CLIENT、SELECT on performance_schema.*)、DSN连接凭证(推荐.my.cnf且chmod 600)及Prometheus抓取地址,三者缺一不可,否则/metrics将返回401/500或无指标。

直接说结论:mysqld_exporter 不是“装上就能用”的黑盒工具,它必须配合 MySQL 权限、连接配置、Prometheus 抓取规则三者对齐才能导出有效指标;Grafana 只负责展示,真正卡住的环节通常在 mysqld_exporter 启动失败或 /metrics 返回空/401/500 —— 这些问题 90% 出在认证或权限上。
MySQL 必须创建专用监控账号并授够权限
mysqld_exporter 不是 root,也不能用应用账号混用。它需要明确、最小化的权限集,否则启动后访问 /metrics 会报错 ERROR 1045 (28000): Access denied 或采集不到关键指标(比如复制延迟、InnoDB 状态)。
-
PROCESS:用于获取线程列表、当前查询等运行时状态 -
REPLICATION CLIENT:读取主从复制状态(SHOW SLAVE STATUS) -
SELECTonperformance_schema.*:现代 MySQL(5.7+)依赖此库采集锁、语句统计、内存分配等深度指标 - 不要只给
SELECT ON *.*,这不够,且不安全;也不要漏掉performance_schema—— 默认安装下该库存在但无 SELECT 权限
执行示例(登录 MySQL 实例后):
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'StrongPass2026!'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'localhost'; GRANT SELECT ON performance_schema.* TO 'exporter'@'localhost'; FLUSH PRIVILEGES;
mysqld_exporter 启动时必须指定有效的连接凭证
凭证不能硬编码在命令行(有泄露风险),也不建议用 --user/--password 参数。正确做法是通过 MySQL 配置文件(如 .my.cnf)传递,并设好文件权限。
- 文件名必须是
.my.cnf或显式用--config.my-cnf=xxx指定,且路径要写对(相对路径容易错) - 内容格式严格:开头不能有空格或 BOM,必须是
[client]小节,字段名大小写敏感(user不是USER) - Linux 下务必
chmod 600 .my.cnf,否则 mysqld_exporter 会拒绝读取(MySQL 客户端安全策略) - 如果 MySQL 实例监听在非 localhost(比如 Docker 容器或远程 IP),
host字段必须填对,且账号需授权'exporter'@'%'或对应 IP
示例 .my.cnf:
[client] user=exporter password=StrongPass2026! host=127.0.0.1 port=3306
启动命令:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
./mysqld_exporter --config.my-cnf=.my.cnf --web.listen-address=":9104"
Prometheus 抓取配置要匹配 exporter 实际监听地址
很多人改了 mysqld_exporter 的 --web.listen-address(比如改成 :9200),却忘了同步改 prometheus.yml 里的 targets,结果 targets 显示 DOWN,日志里全是 connection refused。
- 确认 exporter 进程是否真在运行:
ps aux | grep mysqld_exporter - 确认端口是否被监听:
netstat -tlnp | grep :9104(或你自定义的端口) -
scrape_configs中的targets值必须是 Prometheus 能网络可达的地址:本地部署填localhost:9104,跨主机填192.168.x.x:9104,别用127.0.0.1当作外部可访问地址 - 避免复用 job_name:多个 MySQL 实例要用不同
job_name(如mysql-prod,mysql-staging),否则 Grafana 模板无法区分实例
prometheus.yml 片段示例:
- job_name: 'mysql-prod'
static_configs:
- targets: ['10.0.1.5:9104']
labels:
instance: 'db-prod-01'Grafana 导入模板前先验证 metrics 是否真实返回
别急着导入 Grafana 模板(如 ID 14057 或 7362)。先手动 curl 一下 exporter 的指标端点:
curl -s http://localhost:9104/metrics | head -20
正常应看到大量以 mysql_ 开头的指标行,比如 mysql_global_status_threads_connected、mysql_info_schema_innodb_buffer_pool_bytes_data。如果返回空、HTML 页面、或报 invalid DSN 错误,说明前面三步有遗漏。
- 返回 401?→ MySQL 账号密码错,或
.my.cnf文件权限不对 - 返回 500?→ MySQL 实例不可达,或账号缺
performance_schema权限 - 返回但无
mysql_指标?→ 检查mysqld_exporter日志,常见于 MySQL 版本太低(performance_schema
只有看到有效指标后,再导入 Grafana 模板、配好 Prometheus 数据源,仪表盘才会有数据。模板本身不解决底层连通性问题。

















