EXPLAIN报错“SELECT command denied”实为缺少SHOW VIEW权限,因MySQL解析视图需调用SHOW CREATE VIEW,该操作受SHOW VIEW权限控制,且只能按库授予(如GRANT SHOW VIEW ON app_db.*)。

EXPLAIN报错“SELECT command denied”其实是缺SHOW VIEW权限
执行EXPLAIN SELECT * FROM v_report却报ERROR 1142 (42000): SELECT command denied,不是因为没给SELECT权限,而是MySQL在解析视图时必须调用SHOW CREATE VIEW——这个操作由SHOW VIEW权限控制。没有它,优化器连视图里查了哪些表都不知道,直接拒绝生成执行计划。
关键点在于:SELECT ON v_report ≠ SHOW VIEW ON app_db.*。前者只允许读取视图结果,后者才允许读取视图定义本身。而且SHOW VIEW只能按库授予,写成ON app_db.v_report会报语法错误。
- 必须在视图所在库级别授予权限:
GRANT SHOW VIEW ON app_db.* TO 'user'@'%' - 如果视图SQL里引用了
log_db.access_log,用户还得有SELECT ON log_db.access_log,否则展开定义阶段就失败 - 若视图是
SQL SECURITY DEFINER且DEFINER用户已删,SHOW CREATE VIEW自身就报错,EXPLAIN必然卡住
只让运维看执行计划但不查真实数据:靠视图隔离+权限剪裁
目标是让用户能EXPLAIN v_user_summary、也能SELECT该视图,但绝不能碰users基表里的password或id_card字段。核心不是加权限,而是砍权限。
- 建视图时显式过滤敏感列:
CREATE VIEW v_user_summary AS SELECT id, name, dept FROM users - 只授两项:
GRANT SHOW VIEW ON app_db.* TO 'ops'@'%'+GRANT SELECT ON app_db.v_user_summary TO 'ops'@'%' - 绝对不授
SELECT ON app_db.users——哪怕只漏一条,用户就能绕过视图直查基表 - 若视图跨库(比如
JOIN了finance_db.transactions),对应库的SELECT权限也得严格控制,否则EXPLAIN仍失败
EXPLAIN FORMAT=JSON缺失索引信息?补information_schema表权限
默认EXPLAIN能显示type、key、rows等字段,但FORMAT=JSON会尝试读取information_schema.STATISTICS和information_schema.KEY_COLUMN_USAGE来填充“为什么选这个索引”“为什么没走联合索引”等依据。没权限时,JSON输出里used_columns或possible_keys可能为空或不完整。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
- 补授权:
GRANT SELECT ON information_schema.STATISTICS TO 'user'@'%' - 同理补上:
GRANT SELECT ON information_schema.KEY_COLUMN_USAGE TO 'user'@'%' - 这两项不影响数据访问,但能让
FORMAT=JSON输出真正可用——尤其对DBA做深度调优时很关键
PROCESS权限要不要给?看是否分析含子查询/UNION的语句
PROCESS ON *.*是全局权限,无法限定到库。它不是EXPLAIN的基础依赖,但一旦语句含DERIVED(派生表)、DEPENDENT SUBQUERY或UNION,缺少它就会直接报ERROR 1227 (42501): Access denied; you need (at least one of) the PROCESS privilege(s)。
- 纯单表或简单JOIN查询:可不授
PROCESS,降低权限暴露面 - 要分析报表SQL、ETL脚本这类含多层子查询的语句:必须授,否则
EXPLAIN直接失败 - 注意风险:
PROCESS虽不等于SHOW PROCESSLIST,但在某些MySQL版本下可能被用于探测活跃连接,且无法按库隔离
真正难的不是凑齐这三四条GRANT命令,而是厘清“谁需要看到什么层级的执行细节”。给开发看单表查询,SHOW VIEW + SELECT ON 视图就够了;让DBA诊断慢查询,就得加上information_schema表和PROCESS——每多一条权限,都意味着多一分推断表结构或探测系统状态的能力。










