跳转到主内容
极星编程网:以代码为星,赴技术山海!

mysql如何快速查找具有SUPER权限的用户_查询user表权限列

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

相关文章