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';
SELECT User, Host FROM mysql.user WHERE User = 'api_user';
mysql 库时,SHOW GRANTS FOR ... 会拒绝执行mys
ql.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,漏掉任一环都可能误判。