最直接方法是查询mysql.user表的Super_priv列:SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';MySQL 8.0+还需检查角色继承路径,因用户可能通过角色间接获得SUPER权限。
查
表的
列最直接
MySQL 8.0 之前,权限信息全在
表里,
是个 ENUM 列,值为
或
。直接查它就行,不用绕路。
必须用
,其他视图(比如
)不包含 SUPER 权限
需要
权限才能读
,普通用户默认没这权限,得用 root 或有
的账号执行
注意大小写:
是大写 S、P,不是
或
MySQL 8.0+ 要额外检查角色(Role)继承路径
8.0 引入了角色机制,用户可能没直连
,但被赋予了带 SUPER 权限的角色——这种情况下查
会漏掉。
先查角色本身有没有 SUPER:
(不推荐,表结构复杂)
更可靠的做法是用内置函数
配合
模拟:对每个用户运行
,看输出里是否含
如果脚本批量检查,优先用
关联,再过滤角色的权限定义(需 join
或查
等,实际很碎)
是最准但最慢的验证方式
它反映的是当前生效权限,不受缓存或未刷新权限影响,适合最终确认。但它不能批量查,每次只能指定一个用户。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
执行
,如果结果里出现
,就实锤有权限
注意:
不显示通过角色间接获得的权限(8.0.16+ 才支持
),所以得先查用户被授予了哪些角色
别信
的结果——它返回连接时认证的用户,不是你
的目标用户
常见误判点:
和
这类系统账户
它们在
表里
,但这是 MySQL 内部保留用途,不是 DBA 可用的“真实” SUPER 用户。
这些账户通常
但密码为空或无效,无法登录,只是服务端内部调用用的
查出结果后建议加过滤:
(MySQL 5.7+)
MySQL 8.0 默认禁用
,但如果你看到
+
,基本可判定是人为配置的高权账号,不是系统账户
SUPER 权限极敏感,且 MySQL 不提供“谁最近用了它”的审计日志(除非开了 general_log 或企业版 audit log),查到之后别只盯着列表,得立刻确认这些账号是否仍在业务必要范围内。
mysql.userSuper_privmysql.userSuper_priv'Y''N'SELECT ... FROM mysql.userinformation_schema.role_table_grantsSELECTmysql.userSELECT ON mysql.*Super_privsuper_privSUPER_PRIVSELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';Super_priv='Y'mysql.userSELECT Role FROM mysql.role_edges JOIN mysql.role_column_privs USING (From_host, From_user) WHERE Column_priv = 'Super_priv';IS_ROLE_GRANTED()SHOW GRANTSSHOW GRANTS FOR 'u'@'h';GRANT SUPER ON *.*SELECT ... FROM mysql.role_edges r JOIN mysql.user u ON r.To_user = u.Usermysql.role_column_privsmysql.procs_privSHOW GRANTSSHOW GRANTS FOR 'root'@'localhost';GRANT SUPER ON *.* TO ...SHOW GRANTSSHOW GRANTS FOR ROLESELECT CURRENT_USER();SHOW GRANTS FORmysql.sessionmysql.infoschemamysql.userSuper_priv='Y'plugin='mysql_native_password'WHERE Super_priv = 'Y' AND authentication_string != '' AND account_locked = 'N'old_passwordsplugin='sha256_password'Super_priv='Y'