监控账号必须严格限定为只读权限、精确ip匹配和兼容认证插件。需创建如'monitor'@'10.10.50.%'用户,仅授予performance_schema和information_schema的select权限,禁用process等高危权限,强制使用mysql_native_password插件,并清除匿名用户与grant option。

监控系统账号必须只读、只查状态、不碰业务数据,否则等于把数据库的“体检报告权”和“手术刀”一起交出去。
CREATE USER 时必须显式指定 host,不能用 %
监控程序真实出口 IP 往往是固定网段(比如 Prometheus 节点在 10.10.50.0/24),用 'monitor'@'%' 看似省事,但 MySQL 严格按 host 字段匹配——当连接来自 10.10.50.12,而账号是 @'%',它仍可能因 DNS 解析失败或权限表顺序问题被拒绝,报错 Access denied for user 'monitor'@'10.10.50.12'。
- 查清监控端真实源 IP:
tcpdump -i any port 3306或看监控服务日志 - 建号时写死网段:
CREATE USER 'monitor'@'10.10.50.%' IDENTIFIED WITH mysql_native_password BY 'pwd_2026'; - 若走代理(如 ProxySQL),host 应设为代理机器 IP,例如
'monitor'@'10.100.5.20' - 别依赖 DNS 主机名——MySQL 不 fallback 到 %,解析失败即拒连
GRANT 只给 PERFORMANCE_SCHEMA 和 INFORMATION_SCHEMA 的 SELECT
监控需要的是运行时指标(连接数、慢查询、锁等待、InnoDB 状态),不是业务表。授予 SELECT 权限时,目标必须限定在系统库,且禁止任何写操作。
- 基础监控权限:
GRANT SELECT ON performance_schema.* TO 'monitor'@'10.10.50.%'; - 补充元数据查询:
GRANT SELECT ON information_schema.* TO 'monitor'@'10.10.50.%'; - 绝对禁用:
PROCESS、REPLICATION CLIENT、SUPER——这些是 DBA 工具权限,监控不需要,开了等于放行进程窥探和主从拓扑探测 - 不要
GRANT ALL ON *.*或GRANT SELECT ON myapp.*——业务库字段变更、脱敏规则调整都会让监控误报或暴露敏感字段
认证插件必须与监控客户端兼容
MySQL 8.0 默认用 caching_sha2_password,但很多监控组件(如 Zabbix 的 MySQL 插件、旧版 Percona Monitoring Plugins)仍只支持 mysql_native_password。连接卡在 Access denied,大概率不是权限问题,而是握手失败。
- 建号时强制指定插件:
IDENTIFIED WITH mysql_native_password BY 'pwd_2026' - 验证方式:用监控端相同环境执行命令行连接:
mysql -u monitor -p -h db-prod.internal --default-auth=mysql_native_password -e "SELECT 1" - 已有账号修复:
ALTER USER 'monitor'@'10.10.50.%' IDENTIFIED WITH mysql_native_password BY 'pwd_2026'; - 确认监控配置里没带
init-sql或自定义SET语句——它们可能触发权限检查失败
禁止使用 WITH GRANT OPTION 和匿名用户
监控账号一旦被赋予转授权限,就可能被用于横向提权;而匿名用户(''@'localhost')是默认允许无密码登录的后门,必须清理。
- 删掉所有匿名用户:
DROP USER ''@'localhost'; - 检查现有监控账号是否含
WITH GRANT OPTION:SHOW GRANTS FOR 'monitor'@'10.10.50.%';,如有则立即REVOKE GRANT OPTION ON *.* FROM 'monitor'@'10.10.50.%'; - 自动化脚本中所有
GRANT语句结尾不得出现WITH GRANT OPTION - 监控账号不应出现在
mysql.user表的Grant_priv='Y'行中
最易被忽略的点是:监控账号的权限生效依赖于 host 精确匹配 + 插件兼容 + 无 GRANT OPTION 三者同时成立。少一个,就会出现“明明给了权限却连不上”或“能连上但查不到指标”的情况——这时候别急着加权限,先查 mysql.user 表里的 host、plugin、Grant_priv 三列值。











