SHOW GRANTS最快查看当前用户权限,输出可执行授权语句;查他人权限需指定完整'username'@'host';全局权限查mysql.user,数据库级查mysql.db,表级查mysql.tables_priv,角色权限需额外查mysql.role_edges。

直接查当前用户权限:用 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,漏掉任一环都可能误判。










