必须用grant process on .,其他写法全错;因process是全局权限,语法解析阶段即拒绝绑定库表,仅作用于整个实例,on后只能为.,否则报error 1221。

必须用 GRANT PROCESS ON *.*,其他写法全错。 MySQL 的 PROCESS 权限是全局权限,不接受数据库或表级限定。任何类似 GRANT PROCESS ON mydb.* 或 GRANT PROCESS ON `test`.* 的语句都会触发 ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。
为什么 GRANT PROCESS ON db.* 一定失败
MySQL 权限系统在语法解析阶段就拒绝把 PROCESS 绑定到具体数据库。它只作用于整个实例,和库名、表名完全无关。即使你只想让监控账号查本机连接,host 部分可以写 'localhost',但权限范围仍是全局的,ON 后面只能是 *.*。
- 错误示例:
GRANT PROCESS ON app_db.* TO 'monitor'@'localhost'; - 正确写法:
GRANT PROCESS ON *.* TO 'monitor'@'localhost'; - 如果监控服务连的是远程 MySQL,注意用户 host 要匹配,比如
'monitor'@'%'或'monitor'@'10.0.2.5',否则授权无效
授完权后怎么确认生效了
别只信 SHOW GRANTS 输出里有 PROCESS ON *.* —— 得实际登录验证。
- 用目标用户登录:
mysql -u monitor -p -h localhost - 执行:
SHOW PROCESSLIST; - 看结果里是否有其他用户的连接行(
User列出现root、admin等非当前用户名) - 若
Info列有实际 SQL(非NULL),说明已成功;若只看到自己一行且Info为空,说明权限没生效 - 记得执行过
FLUSH PRIVILEGES;,否则新权限不加载
搭配 SELECT 和 REPLICATION CLIENT 才算完整监控权限
单给 PROCESS 只能看线程列表,没法采集复制延迟、InnoDB 锁、语句统计等关键指标。
- 必须加:
GRANT SELECT ON performance_schema.* TO 'monitor'@'localhost';(不是SELECT ON *.*,太宽泛也不安全) - 主从环境必须加:
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'localhost'; - 三项缺一不可:
PROCESS、REPLICATION CLIENT、SELECT ON performance_schema.* - 别开
SHOW DATABASES—— 它会让监控账号列出所有库名,属于信息泄露
真正容易被忽略的是:哪怕只给一个内网监控账号 PROCESS 权限,只要它能连上 MySQL,就等于把实例的实时运行快照交了出去。Info 字段可能含明文条件,User/Host 可用于横向探测,这个权限不该出现在应用账号里,也不该用 % 泛授权。











