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