关键在于mysqld_exporter能否连通MySQL、权限是否充足(PROCESS/REPLICATION CLIENT/SELECT on performance_schema.*,MySQL 8.0还需SHOW DATABASES)、配置是否正确加载;任一环节缺失均导致Prometheus收不到指标、Grafana面板为空。

能监控 MySQL,关键不在 Prometheus 本身,而在于 mysqld_exporter 能否连上 MySQL、权限是否够、配置是否被正确加载。漏掉任一环,Prometheus 就收不到指标,Grafana 面板就是空的。
mysqld_exporter 启动失败:先看日志里是不是 dial tcp 或 access denied
这不是 Prometheus 的问题,是 mysqld_exporter 根本没连上库。最常见两种报错:
-
dial tcp 127.0.0.1:3306: connect: connection refused→ MySQL 没在监听该地址/端口,或防火墙拦了 -
access denied for user 'xxx'@'localhost'→ 账号密码错,或权限不足(尤其 MySQL 8.0 会额外报SHOW DATABASES权限缺失)
DATA_SOURCE_NAME 必须严格按格式写:user:password@tcp(host:port)/,末尾的 / 不能省;用 socket 则写成 user:password@unix(/tmp/mysql.sock)/。
MySQL 账号必须显式授予:
-
PROCESS和REPLICATION CLIENT(全局) SELECT ON performance_schema.*- MySQL 8.0 还要加
SHOW DATABASES,否则启动时直接报错退出
别复用 root 或应用账号——建专用账号,例如:
CREATE USER 'prom_mysqld'@'localhost' IDENTIFIED BY 'strong_pass_2026'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'prom_mysqld'@'localhost'; GRANT SELECT ON performance_schema.* TO 'prom_mysqld'@'localhost'; GRANT SHOW DATABASES ON *.* TO 'prom_mysqld'@'localhost'; FLUSH PRIVILEGES;
prometheus.yml 里 job 配置不生效:检查 targets 和 metrics_path
即使 mysqld_exporter 自己跑起来了,Prometheus 也可能完全不拉取数据。原因通常是:
- YAML 缩进错误(
static_configs下的- targets必须和上层对齐) -
targets填的是mysqld_exporter所在机器的 IP + 端口(默认9104),不是 MySQL 的3306 -
metrics_path写错(默认是/metrics,改过路径就得同步配) - 启用了 Basic Auth 却没配
basic_auth块;启用了 TLS 却没设scheme: https和tls_config
建议显式加 scrape_timeout: 10s,避免 MySQL 响应慢导致采集超时跳过。示例片段:
- job_name: 'mysqld_exporter' scrape_timeout: 10s static_configs: - targets: ['192.168.1.30:9104'] metrics_path: /metrics
Grafana 面板空着:先去 Prometheus 的 /targets 页面确认状态
别急着重装 Dashboard 或调查询语句。打开 http://<prometheus-ip>:9090/targets,看 mysqld_exporter job 的状态:
- 显示
UP但没数据 → 检查mysqld_exporter日志,大概率是权限或 SQL 查询失败(比如performance_schema被禁用) - 显示
DOWN→ 点开 “Last Error” 看具体报错,基本对应上面两类问题 - 目标存在但
Labels为空 → 可能mysqld_exporter启动时加了--web.listen-address绑定到了127.0.0.1,外部 Prometheus 拉不到
MySQL 侧还要确认:performance_schema 是否启用(show variables like 'performance_schema'; 返回 ON)、sql_mode 是否含 STRICT_TRANS_TABLES(某些旧版 exporter 会因 strict mode 报错)。
真正卡住的地方往往不是 Prometheus 配置,而是 mysqld_exporter 和 MySQL 之间的那条连接线——它既依赖网络通路,又依赖账号权限,还受 MySQL 版本特性和运行时参数影响。每一步都得单独验证,不能假设“启动没报错=连上了”。


















