<p>必须授予 PROCESS、REPLICATION CLIENT、SELECT 三项权限,缺一不可;MySQL 8.0+ 还需显式授权 performance_schema.,因 SELECT ON .* 不包含 performance_schema 中 events_statements_summary_by_digest 等关键指标表,导致 mysqld_exporter 采集失败,Grafana 面板指标为空。</p>

必须只给 PROCESS、REPLICATION CLIENT、SELECT 三项权限,缺一不可;MySQL 8.0+ 还需显式授权 performance_schema.*,否则部分指标采集失败。
为什么不能只给 SELECT ON *.*?
SELECT ON *.* 看似覆盖全部库表,但实际无法访问 performance_schema 和 information_schema 中的动态统计表(如 events_statements_summary_by_digest),而 mysqld_exporter 依赖这些表采集慢查询、锁等待等关键指标。MySQL 8.0 默认限制对 performance_schema 的访问,即使 SELECT ON *.* 也不自动包含它。
常见错误现象:mysqld_exporter 启动后日志无报错,但 Prometheus 抓到的指标里缺失 mysql_global_status_slow_queries、mysql_info_schema_table_rows 等字段,Grafana 面板大量空值。
- MySQL 5.7:执行
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'monitor'@'127.0.0.1'; - MySQL 8.0+:额外加一句
GRANT SELECT ON performance_schema.* TO 'monitor'@'127.0.0.1'; - 别碰
information_schema单独授权——8.0+ 下SELECT ON *.*已隐含对其只读访问,显式授权反而可能触发兼容性警告
host 值写成 '%' 会出什么问题?
监控账号的 host 必须严格匹配 mysqld_exporter 实际连接来源,否则权限不生效。写成 '%' 表面看方便,但 MySQL 8.0+ 默认启用 caching_sha2_password 认证插件,远程连接(尤其跨网络)容易因 SSL 或 DNS 解析失败导致认证卡住,表现为 Access denied for user 'monitor'@'x.x.x.x',而日志里看不到具体拒绝原因。
更稳妥的做法是精确指定 exporter 所在主机 IP 或使用 'localhost'(仅限本地 socket 连接):
- Exporter 和 MySQL 同机:用
'localhost',走 Unix socket,绕过网络层和 DNS - Exporter 在另一台机器:明确写成
'192.168.10.5'(Exporter 主机 IP),不要用'%' - 确认防火墙放行 MySQL 端口(默认 3306)且 MySQL 配置中
bind_address允许该 IP 连入
mysqld_exporter 启动时提示 "failed to ping mysqld" 怎么快速定位?
这个错误不是数据库没启动,而是 exporter 根本连不上 MySQL 或权限校验失败。优先检查三件事:
- 认证文件
.my.cnf权限是否为600(chmod 600 /path/to/.my.cnf),否则 mysqld_exporter 会拒绝读取 - 文件里
host=值是否和创建用户时的host完全一致(比如用户是'monitor'@'127.0.0.1',但配置里写host=localhost,二者在 MySQL 权限系统中不等价) - 用相同配置手动测试连接:
mysql --defaults-file=/path/to/.my.cnf -e "SHOW PROCESSLIST;",如果这步失败,说明权限或网络问题已暴露,不用再查 exporter 日志
最容易被忽略的是 MySQL 8.0+ 的默认认证插件切换——即使你用 mysql_native_password 创建了用户,若服务端未加载该插件或客户端未指定,连接会在认证阶段静默失败。此时 failed to ping mysqld 是唯一可见线索,但错误信息里不会提插件名。


















