mysqld_exporter不是开箱即用工具,必须正确配置MySQL监控账号权限(PROCESS、REPLICATION CLIENT、SELECT on performance_schema.*)、DSN连接凭证(推荐.my.cnf且chmod 600)及Prometheus抓取地址,三者缺一不可,否则/metrics将返回401/500或无指标。
直接说结论:mysqld_exporter 不是“装上就能用”的黑盒工具,它必须配合 MySQL 权限、连接配置、Prometheus 抓取规则三者对齐才能导出有效指标;Grafana 只负责展示,真正卡住的环节通常在启动失败或返回空/401/500 —— 这些问题 90% 出在认证或权限上。
MySQL 必须创建专用监控账号并授够权限
mysqld_exporter 不是 root,也不能用应用账号混用。它需要明确、最小化的权限集,否则启动后访问
会报错
或采集不到关键指标(比如复制延迟、InnoDB 状态)。
:用于获取线程列表、当前查询等运行时状态
:读取主从复制状态(
)
on
:现代 MySQL(5.7+)依赖此库采集锁、语句统计、内存分配等深度指标
不要只给
,这不够,且不安全;也不要漏掉
—— 默认安装下该库存在但无 SELECT 权限
执行示例(登录 MySQL 实例后):
mysqld_exporter 启动时必须指定有效的连接凭证
凭证不能硬编码在命令行(有泄露风险),也不建议用
/
参数。正确做法是通过 MySQL 配置文件(如
)传递,并设好文件权限。
文件名必须是
或显式用
指定,且路径要写对(相对路径容易错)
内容格式严格:开头不能有空格或 BOM,必须是
小节,字段名大小写敏感(
不是
)
Linux 下务必
,否则 mysqld_exporter 会拒绝读取(MySQL 客户端安全策略)
如果 MySQL 实例监听在非 localhost(比如 Docker 容器或远程 IP),
字段必须填对,且账号需授权
或对应 IP
示例
:
启动命令:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
Prometheus 抓取配置要匹配 exporter 实际监听地址
很多人改了
的
(比如改成
),却忘了同步改
里的
,结果 targets 显示
,日志里全是
。
确认 exporter 进程是否真在运行:
确认端口是否被监听:
(或你自定义的端口)
中的
值必须是 Prometheus 能网络可达的地址:本地部署填
,跨主机填
,别用
当作外部可访问地址
避免复用 job_name:多个 MySQL 实例要用不同
(如
,
),否则 Grafana 模板无法区分实例
prometheus.yml 片段示例:
Grafana 导入模板前先验证 metrics 是否真实返回
别急着导入 Grafana 模板(如 ID
或
)。先手动 curl 一下 exporter 的指标端点:
正常应看到大量以
开头的指标行,比如
、
。如果返回空、HTML 页面、或报
错误,说明前面三步有遗漏。
返回 401?→ MySQL 账号密码错,或
文件权限不对
返回 500?→ MySQL 实例不可达,或账号缺
权限
返回但无
指标?→ 检查
日志,常见于 MySQL 版本太低(performance_schema
只有看到有效指标后,再导入 Grafana 模板、配好 Prometheus 数据源,仪表盘才会有数据。模板本身不解决底层连通性问题。
mysqld_exporter/metrics/metricsERROR 1045 (28000): Access deniedPROCESSREPLICATION CLIENTSHOW SLAVE STATUSSELECTperformance_schema.*SELECT ON *.*performance_schemaCREATE USER 'exporter'@'localhost' IDENTIFIED BY 'StrongPass2026!';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'localhost';
GRANT SELECT ON performance_schema.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;--user--password.my.cnf.my.cnf--config.my-cnf=xxx[client]userUSERchmod 600 .my.cnfhost'exporter'@'%' .my.cnf[client]
user=exporter
password=StrongPass2026!
host=127.0.0.1
port=3306./mysqld_exporter --config.my-cnf=.my.cnf --web.listen-address=":9104"mysqld_exporter--web.listen-address:9200prometheus.ymltargetsDOWNconnection refusedps aux | grep mysqld_exporternetstat -tlnp | grep :9104scrape_configstargetslocalhost:9104192.168.x.x:9104127.0.0.1job_namemysql-prodmysql-staging- job_name: 'mysql-prod'
static_configs:
- targets: ['10.0.1.5:9104']
labels:
instance: 'db-prod-01'140577362curl -s http://localhost:9104/metrics | head -20mysql_mysql_global_status_threads_connectedmysql_info_schema_innodb_buffer_pool_bytes_datainvalid DSN.my.cnfperformance_schemamysql_mysqld_exporter