部署 mysqld_exporter 仅需三步:创建最小权限监控账号(process、replication client、select)、配置标准 my.cnf 连接文件(user/password/host/port)、启动导出器并配置 prometheus 抓取。

直接上手就能跑通,不需要改源码、不依赖 Helm(除非你已经在用),核心就三步:建监控账号、配连接文件、启导出器。下面按真实部署顺序拆解。
创建最小权限监控账号
mysqld_exporter 不需要 root,也不该给 root。它只读状态和元数据,权限越小越安全,也避免未来升级时因权限变更导致采集失败。
- 必须授予的权限只有三个:
PROCESS、REPLICATION CLIENT、SELECT -
PROCESS用于获取线程/连接状态(如mysql_global_status_threads_connected) -
REPLICATION CLIENT是主从延迟、GTID 状态等指标的必要权限 -
SELECT要限定在information_schema和performance_schema(部分版本需显式授权,尤其 MySQL 8.0+)
执行语句示例(替换密码和 host):
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_strong_password'; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'; FLUSH PRIVILEGES;⚠️ 注意:如果 MySQL 启用了
sql_require_primary_key 或强密码策略,CREATE USER 可能报错,此时先关策略或换更宽松的密码规则。
配置 my.cnf 连接文件并验证可连通性
mysqld_exporter 通过 --config.my-cnf 参数加载一个标准 MySQL 客户端配置文件,不是任意 ini 文件——它必须是 [client] 段,且不能有空格或 BOM 头。
关键字段只有四个:
-
user:上面建的账号名 -
password:对应密码(明文,所以这个文件权限必须设为600) -
host:MySQL 实例地址(别写localhost,它会走 socket;写127.0.0.1或内网 IP 才走 TCP) -
port:端口,默认3306
示例 /etc/mysql_exporter/.my.cnf:
[client] user=exporter password=your_strong_password host=10.10.20.5 port=3306
验证是否能连:
mysql --defaults-file=/etc/mysql_exporter/.my.cnf -e "SELECT 1"失败就别急着启
mysqld_exporter,先查网络、防火墙、MySQL 的 bind-address 和 skip-networking 设置。
启动 mysqld_exporter 并确认 metrics 可访问
下载最新稳定版二进制(比如v0.15.1),解压后直接运行:
./mysqld_exporter --config.my-cnf=/etc/mysql_exporter/.my.cnf --web.listen-address="0.0.0.0:9104" --collect.global_status --collect.info_schema.innodb_tablespaces
-
--web.listen-address必须显式指定,否则默认只监听127.0.0.1:9104,外部 Prometheus 抓不到 -
--collect.*参数可选,但建议至少保留--collect.global_status(基础指标全靠它);其他 collector 如perf_schema.eventswaits会显著增加 MySQL 查询负载,新环境先关 - 启动后立刻 curl 测试:
curl -s @#@#@#@#@#@#@#@#@#@0 | head -20,看到一堆# HELP mysql_...就说明活了
常见卡点:
- systemd 启动时报
permission denied:多半是.my.cnf权限不对,或User=配错了(得用能读该文件的用户) - metrics 返回空或 404:检查
--web.listen-address是否绑对了地址,以及防火墙是否放行9104 - 报错
error collecting metric “global_status”: dial tcp: lookup ... no such host:host值 DNS 解析失败,换 IP
让 Prometheus 开始抓取这个目标
在prometheus.yml 的 scrape_configs 下加一段:
- job_name: 'mysql'
static_configs:
- targets: ['10.10.20.5:9104'] # 注意:这里是 exporter 地址,不是 MySQL 地址
relabel_configs:
- source_labels: [__address__]
regex: '([^:]+):\d+'
target_label: instance
replacement: '$1'
- 关键区别:target 是
mysqld_exporter的监听地址,不是 MySQL 本身 -
relabel_configs这段只是让 instance 标签显示成 IP 而非带端口的字符串,方便识别 - 改完记得
kill -HUP $(pidof prometheus)或用curl -X POST @#@#@#@#@#@#@#@#@#@1(需开启--web.enable-admin-api)
真正容易被忽略的是 collector 的开销控制。哪怕只开 --collect.global_status,每 15 秒一次 SHOW GLOBAL STATUS 对高负载 MySQL 也可能成为隐性压力源。上线后务必盯住 mysql_global_status_questions 曲线是否异常抬升——如果是,就得关掉非必要 collector,或拉长 scrape_interval。











