运行EXPLAIN或EXPLAIN ANALYZE需授予用户哪些权限?
授予用户运行EXPLAIN/EXPLAIN ANALYZE的必要权限配置
不存在单独的EXPLAIN或EXPLAIN ANALYZE专属权限,权限要求完全和你要解释的目标SQL绑定,两类语句的权限差异来自本身执行逻辑的区别:
- 普通
EXPLAIN:只生成执行计划,不会实际执行目标SQL,只需给用户授予目标SQL语句本身所需的全部操作权限即可
比如要让用户执行EXPLAIN SELECT * FROM user_table,给用户授予user_table的SELECT权限就满足要求;如果要解释的是INSERT语句,就授予对应表的INSERT权限,以此类推。 EXPLAIN ANALYZE:会实际运行目标SQL,再返回带真实运行统计的执行计划,权限要求和直接执行对应目标SQL完全一致,除了目标SQL本身需要的库、表、列操作权限外,没有额外要求
比如要执行EXPLAIN ANALYZE DELETE FROM log_table WHERE create_time < '2023-01-01',用户必须持有log_table的DELETE权限,否则会直接报权限错误。
注意:
- 部分极老旧的数据库版本(比如MySQL 5.1及更早)曾要求执行
EXPLAIN需要全局PROCESS权限,这个限制在所有新版本中已经移除,不要额外授予不必要的全局权限,严格遵循最小权限原则即可- 不要图方便给用户开全库或者全局级别的权限,仅开放其需要解释的SQL涉及到的对应资源的对应操作权限就够了
以MySQL 8.0为例,给用户app_query授予对业务库sales下sale_record表执行EXPLAIN SELECT、EXPLAIN ANALYZE SELECT/UPDATE的权限,直接运行如下授权语句即可:
-- 授予SELECT权限,满足EXPLAIN SELECT、EXPLAIN ANALYZE SELECT的权限要求 GRANT SELECT ON sales.sale_record TO 'app_query'@'192.168.1.%'; -- 授予UPDATE权限,满足EXPLAIN ANALYZE UPDATE的权限要求 GRANT UPDATE ON sales.sale_record TO 'app_query'@'192.168.1.%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
PostgreSQL等其他主流关系型数据库的权限逻辑完全一致:没有单独的EXPLAIN类专属权限,仅需要匹配目标SQL本身的操作权限即可正常运行。
内容的提问来源于stack exchange,提问作者Orlando Colamatteo
相关产品推荐
相关产品推荐

