必须显式授予process、replication client、select权限,mysql 8.0+还需额外grant select on performance_schema.;仅select on .*无法访问performance_schema关键表,导致指标采集失败且无报错。

必须显式授予 PROCESS、REPLICATION CLIENT、SELECT 三项权限,且 MySQL 8.0+ 需额外 GRANT SELECT ON performance_schema.*;用 '%' 作 host 或依赖 read_only=ON 拦截监控账号,都会导致权限失控或采集失败。
为什么不能只给 SELECT ON *.*
MySQL 8.0 默认限制对 performance_schema 的访问,即使 SELECT ON *.* 也不自动包含其中关键指标表(如 events_statements_summary_by_digest)。mysqld_exporter 依赖这些表采集慢查询、锁等待等指标,缺了就表现为 Grafana 面板大量空值,但日志里不报错。
-
SELECT ON *.*包含information_schema(MySQL 8.0+ 已隐式允许),但不等于能读performance_schema所有视图 -
REPLICATION CLIENT和PROCESS是独立的全局权限,不属于SELECT范畴,必须显式写出 - 错误示例:
GRANT SELECT ON *.* TO 'exporter'@'%'→ 连SHOW PROCESSLIST都被拒绝,报Access denied; you need (at least one of) the PROCESS privilege(s)
CREATE USER 必须指定认证插件和精确 host
MySQL 8.0+ 默认使用 caching_sha2_password,但多数 mysqld_exporter 版本(v0.14.x 及更早)不支持,连不上时只会卡在 Access denied for user,而非提示认证方式问题。
- 创建用户时务必指定兼容插件:
CREATE USER 'exporter'@'10.0.0.11' IDENTIFIED WITH mysql_native_password BY 'StrongPass2026!' -
host必须是 exporter 实际出站 IP,不是容器内网地址(如172.18.0.5),也不是'%'—— DNS 解析失败或 SSL 协商异常会导致静默拒绝 - 同机部署优先用
'localhost',走 Unix socket,绕过网络层干扰
授权后要主动回收敏感系统库访问
虽然 SELECT ON *.* 看似方便,但它默认开放 information_schema.user_privileges、performance_schema.role_edges 等含账号/角色元数据的表,监控完全不需要,反而造成信息泄露。
- 授完基础权限后,立刻执行:
REVOKE SELECT ON information_schema.* FROM 'exporter'@'10.0.0.11' - 同样执行:
REVOKE SELECT ON performance_schema.* FROM 'exporter'@'10.0.0.11' - 再单独补上真正需要的:
GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO 'exporter'@'10.0.0.11'(或直接performance_schema.*,按需裁剪) - 别碰
mysql库——它不在SELECT ON *.*范围内,但一旦误授ALL PRIVILEGES就全暴露
验证账号是否真“只读”且“只监不控”
别只测 SHOW SLAVE STATUS 成功就收工。登录后必须手动验证几项边界行为,否则上线后才发现越权。
- 执行
SELECT COUNT(*) FROM mysql.user→ 应报ERROR 1142 (42000): SELECT command denied - 执行
STOP SLAVE→ 应报ERROR 1227 (42501): Access denied; you need ... REPLICATION_SLAVE_ADMIN - 执行
INSERT INTO test.t1 VALUES(1)→ 应报ERROR 1290 (HY000): The MySQL server is running with the --read-only option(说明没被误授写权限,且实例层read_only生效) - 执行
SHOW CREATE TABLE t1→ 若失败,大概率缺information_schema.TABLES授权,需补GRANT SELECT ON information_schema.TABLES TO 'exporter'@'10.0.0.11'
最易忽略的是:权限配置只是半截腿。真正的安全闭环,得靠 super_read_only = ON(从库) + bind_address 白名单 + 防火墙端口限制三者配合,否则单靠账号权限,防不住提权或横向移动。











