mysql 5.7+默认禁止普通用户访问performance_schema,必须显式授权select on performance_schema.*或具体表,并启用instruments/consumers才能查到数据。

普通用户无法查看 performance_schema,不是权限没给全,而是 MySQL 从 5.7 开始就默认切断了非 root 用户的访问通路——哪怕你 GRANT 了 SELECT ON *.*,也完全不影响 performance_schema 的权限隔离。
ERROR 1142 报错说明权限根本没生效
典型现象是执行 SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest; 直接报 ERROR 1142 (42000): SELECT command denied to user 'u1'@'%' for table 'events_statements_summary_by_digest'。这不是表不存在,也不是用户被锁,而是权限系统压根没把这次查询放行。
-
SHOW PRIVILEGES查不到performance_schema相关项,因为它不走全局权限列表,只认具体库表级SELECT - 即使你执行过
GRANT SELECT ON *.* TO 'u1'@'%',也不会覆盖performance_schema—— 它被 MySQL 当作“系统库”特殊处理,必须单独授权 - 正确写法只能是:
GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO 'u1'@'%';或更宽泛但需谨慎的GRANT SELECT ON performance_schema.* TO 'u1'@'%'; - MySQL 8.0+ 默认关闭隐式继承,
FLUSH PRIVILEGES在用GRANT语句时通常自动生效,但若手动改过mysql.tables_priv表,则必须执行
授了权还是查不到数据?检查 instruments 和 consumers
权限只是第一步。授完权看到空结果(比如 COUNT(*) 返回 0),大概率是采集开关没开: performance_schema 不是“开库即有数据”,而是按需采集,靠 setup_instruments 和 setup_consumers 控制是否记录、是否汇总。
- 查语句摘要必须启用对应 instrument:
SELECT NAME, ENABLED, TIMED FROM performance_schema.setup_instruments WHERE NAME LIKE 'statement/sql/%';—— 若ENABLED = 'NO',再授权也没数据 - 批量开启建议:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/sql/%'; - 同时打开消费者,否则数据进不了汇总表:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('events_statements_current', 'events_statements_summary_by_digest'); - 这些修改重启后失效;如需持久化,得在配置文件里加
performance-schema-instrument='statement/sql/%=ON'等参数
RDS 或低配实例可能直接禁用 performance_schema
云厂商(如阿里云 RDS 基础版)常默认关闭 performance_schema,或把内存类参数设为 0,导致引擎加载失败或表为空。这不是权限问题,而是功能被阉割。
- 先确认是否启用:
SHOW VARIABLES LIKE 'performance_schema';返回ON才算通过第一关 - 再查引擎是否就位:
SHOW ENGINES;中PERFORMANCE_SCHEMA行的Support必须是YES,否则整个库不可用 - 如果
performance_schema_max_statement_classes等变量全是 0,说明实例被限制了资源分配,需调大或换高配规格(部分云厂商不开放该配置) - RDS 用户请直接查文档确认是否支持;不支持就别折腾权限,换
information_schema.PROCESSLIST或慢日志替代
最易忽略的一点:有些表(如 processlist、mutex_instances)即使授了 SELECT 权限,普通用户依然查不了——它们硬性依赖 PROCESS 或 SUPER 权限。别盲目授 performance_schema.*,按需最小授权才是安全且有效的做法。











