只因performance_schema是伪库,权限必须显式授予具体表(如events_statements_summary_by_digest),不可用ON performance_schema.批量授权,且默认不包含在GRANT SELECT ON .*范围内。

为什么只给 SELECT 还连不上 performance_schema?
第三方审计工具(如 Prometheus + mysqld_exporter、Percona Monitoring、自研采集脚本)常需读 performance_schema 和 information_schema,但这些库不归入普通数据库权限体系。即使你执行了 GRANT SELECT ON *.*,MySQL 仍默认拒绝访问 performance_schema —— 它是“伪库”,权限必须显式授予每张表,且不能用 ON performance_schema.* 批量授权。
GRANT SELECT 到具体表,不是库
审计系统真正依赖的是少数几张高价值统计表,而非整个 schema。盲目授 performance_schema.* 会暴露线程堆栈、SQL 文本、锁等待链等敏感信息,且 MySQL 8.0+ 会直接报错拒绝该语法。
-
GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO 'auditor'@'%';(必授,SQL 执行频次与指纹) -
GRANT SELECT ON performance_schema.events_waits_summary_global_by_event_name TO 'auditor'@'%';(必授,全局等待事件聚合) -
GRANT SELECT ON information_schema.TABLES TO 'auditor'@'%';(可选,仅当工具需自动发现表) -
GRANT SELECT ON information_schema.STATISTICS TO 'auditor'@'%';(可选,查索引分布)
不要授 performance_schema.threads 或 processlist——它们含当前 SQL 文本,属高危泄露点。
认证插件和 host 匹配是隐形断连点
即使权限全给了,pymysql、mysqlclient 或某些旧版 exporter 仍可能报 Access denied for user。这不是权限问题,而是认证层不兼容:
- MySQL 8.0+ 默认用
caching_sha2_password,而多数审计 agent 仍依赖mysql_native_password - 创建账号时必须显式指定:
CREATE USER 'auditor'@'10.20.30.%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 确认审计服务器真实出口 IP 匹配 host 模式;若走 Kubernetes Service 或云 LB,需查
SELECT SUBSTRING_INDEX(USER(), '@', -1);确认实际连接来源
视图封装不可用于 performance_schema
有人想用视图把 events_statements_summary_by_digest 字段裁剪后再授予权限,这条路走不通:MySQL 不允许在 performance_schema 上创建视图(报错 ERROR 1356 (HY000)),也不支持对其设 SQL SECURITY DEFINER。所有授权必须落在原始表上,且不能绕过字段级控制——这意味着你得信任审计工具不会滥用字段,或在应用层做结果过滤。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/125584.html