mysql如何查看用户权限_mysql权限查询方式

来源:这里教程网 时间:2026-02-28 20:36:50 作者:

直接查当前用户权限:用
SHOW GRANTS
最快

登录 MySQL 后,执行

SHOW GRANTS;
就能立刻看到你当前会话用户的全部权限语句。它不依赖权限表结构,也不需要额外 SELECT 权限,只要能连上就能用。

输出是可执行的授权语句(比如
GRANT SELECT, INSERT ON `testdb`.* TO 'app'@'%'
),非常直观
等价写法还有
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
,效果一样
注意:
SHOW GRANTS;
不显示“未显式授予但继承自角色”的权限(MySQL 8.0+ 角色机制下需额外查
mysql.role_edges

查其他用户权限:必须带
@'host'
才生效

想看别人权限?得把用户名和主机名配对写全,否则报错

ERROR 1141 (42000): There is no such grant defined for user 'xxx' on host '%'
—— 这是最常卡住的地方。

例如查远程应用用户:
SHOW GRANTS FOR 'api_user'@'%';
查本地管理用户:
SHOW GRANTS FOR 'admin'@'localhost';
如果不确定 host 是什么,先查
SELECT User, Host FROM mysql.user WHERE User = 'api_user';
没有 SUPER 或 SELECT 权限在
mysql
库时,
SHOW GRANTS FOR ...
会拒绝执行

查权限底层字段:看
mysql.user
表里的 _priv 列

当你要批量判断某类权限是否开启(比如确认所有用户都禁用了

DROP
),直接读
mysql.user
表比解析
SHOW GRANTS
输出更可靠。

关键字段如
Select_priv
Drop_priv
Super_priv
值为
'Y'
'N'
示例命令:
SELECT User, Host, Select_priv, Insert_priv, Drop_priv, Super_priv FROM mysql.user WHERE User = 'backup_user'\G
⚠️ 注意:这些只反映全局权限,数据库/表/列级权限不在这个表里 —— 它们分别存在
mysql.db
mysql.tables_priv
mysql.columns_priv

细粒度权限在哪查:按作用域分表定位

MySQL 把权限按层级拆到不同系统表,查错表就看不到真实权限。比如给用户开了

myapp.*
的 SELECT,但在
mysql.user
里查不到这条记录。

数据库级权限(如
GRANT SELECT ON myapp.*
)→ 查
mysql.db
SELECT User, Host, Db, Select_priv, Insert_priv FROM mysql.db WHERE User = 'app_user' AND Db = 'myapp';
表级权限(如
GRANT UPDATE ON myapp.logs
)→ 查
mysql.tables_priv
列级权限(极少见,但存在)→ 查
mysql.columns_priv
所有这些表修改后,记得执行
FLUSH PRIVILEGES;
(仅当你手动 UPDATE 系统表时才需要;用
GRANT
语句则自动生效)

实际排查时,别只盯着一个命令或一张表。权限叠加逻辑复杂,

SHOW GRANTS
是第一眼答案,
mysql.user
+
mysql.db
组合才是真相底稿。尤其在 MySQL 8.0 启用角色后,还得加查
mysql.role_edges
mysql.proxies_priv
,漏掉任一环都可能误判。

相关推荐