<p>PERFORMANCE_SCHEMA 需显式授权 SELECT ON performance_schema.* 才可访问,因它绕过通配符授权逻辑;仅授最小必要权限,避免启用敏感 instruments 导致 SQL 文本泄露。</p>

PERFORMANCE_SCHEMA 不是默认开放给普通用户的,哪怕你已经给了 SELECT ON <em>.</em>,它依然不可见——这是 MySQL 的硬性权限隔离设计。
要让测试或运维用户临时查慢查询、锁等待、语句执行耗时等诊断数据,必须显式授权,并注意控制粒度和风险边界。
为什么 GRANT SELECT ON *.* 不生效
MySQL 把 performance_schema、information_schema 和 sys 视为特殊系统库,不参与通配符授权逻辑。即使执行了:
GRANT SELECT ON *.* TO 'test_user'@'%';
该用户仍无法访问 performance_schema.events_statements_summary_by_digest 等表,查询会直接报错:
ERROR 1142 (42000): SELECT command denied to user 'test_user'@'%' for table 'events_statements_summary_by_digest'
根本原因是:这些库的权限检查绕过常规 schema 级授权路径,必须单独声明。
只授最小必要权限:GRANT SELECT ON performance_schema.*
执行这条命令即可开通基础诊断能力:
GRANT SELECT ON performance_schema.* TO 'test_user'@'%';
注意以下几点:
- 不能写成
GRANT SELECT ON performance_schema.events_statements_current—— 单表授权无效,必须用performance_schema.* - 如果用户还需查看锁信息(如
data_locks),得额外加授:GRANT PROCESS ON *.*(MySQL 8.0.26+ 才允许非 super 用户查此表) - 若需用
sys库的视图(如sys.statement_analysis),还要确保该用户有SELECT权限在sys库上,且sys库本身依赖performance_schema已启用并授权
避免暴露敏感内容:别开全量 instruments
授权 SELECT ON performance_schema.* 只是“能查”,但实际能查到什么,还取决于 Performance Schema 内部是否采集了对应事件。默认配置下,很多高开销 or 高敏感的 instrument 是关闭的(比如记录 SQL 文本的 statement/sql/select 默认 TIMED=ON 但可能 ENABLED=NO)。
如果你手动启用了全部 instruments(例如通过 UPDATE performance_schema.setup_instruments SET ENABLED='YES', TIMED='YES'),那么 events_statements_history 或 events_statements_current 就可能包含完整 SQL 文本——包括带参数值的 WHERE id = 123,这在测试库含脱敏数据时等于变相泄露。
建议只按需开启:
- 查慢查询摘要:
events_statements_summary_by_digest足够,且默认开启 - 查当前阻塞链:
data_lock_waits+data_locks,需确认 MySQL 版本支持且已启用lock_wait相关 instrument - 避免启用
events_statements_history_long或设大performance_schema_events_statements_history_long_size,否则历史 SQL 易堆积且难清理
临时权限回收:用 REVOKE 而不是 DROP USER
测试结束后,及时回收权限:
REVOKE SELECT ON performance_schema.* FROM 'test_user'@'%';
注意:
- 不要用
DROP USER,除非真要删账号;REVOKE更精准、可逆 - 权限变更后无需重启 MySQL,但用户需断开重连才能生效(连接复用时权限缓存仍在)
- 若用户还持有
PROCESS或SUPER等高危权限,务必一并检查回收
真正容易被忽略的是:performance_schema 表里查到的 SQL 文本、表名、甚至部分参数值,都可能构成数据面泄露。哪怕只是测试库,只要字段名或业务逻辑能反推真实含义,就不该默认放行——授完权,还得看它实际返回了什么。



















