查用户全局权限最直接用 show grants for 'user'@'host',结果含 grant all privileges on . 或明确全局权限即拥有;注意需用完整账号格式,角色权限需加 using,动态权限单独列出,比查 mysql.user 更准且反映实时权限。

查用户全局权限用 SHOW GRANTS 最直接
别翻 mysql.user 表手动比对字段,容易漏掉动态权限或误判 NULL 和 N 含义。直接对目标用户执行 SHOW GRANTS FOR 'user'@'host',返回结果里只要出现 GRANT ALL PRIVILEGES ON *.* 或明确列出如 CREATE USER、RELOAD 等全局权限,就说明有全局权限。
注意:必须用带 @'host' 的完整账号格式,否则可能查错用户;如果用户不存在,会报错 ERROR 1141 (42000): There is no such grant defined for user 'xxx' on host 'yyy'。
-
SHOW GRANTS是运行时视图,反映当前生效权限,比查表更准 - 若用户是通过角色(role)继承权限,
SHOW GRANTS默认不展开角色权限,需加USING role_name才能看到 - MySQL 8.0+ 支持动态权限(如
BACKUP_ADMIN),它们不会出现在*.*的GRANT行里,而是单独一行,例如GRANT BACKUP_ADMIN ON *.*
mysql.user 表字段含义不能硬背,重点看这三列
想从表里确认,核心只盯 Grant_priv、Super_priv 和 authentication_string 是否为空(不是 NULL)——但光看这些不够。真正决定全局 DDL/DML 权限的是 Select_priv 到 Xtra_priv 这二十多个布尔字段,值为 Y 表示开启。
常见误解:Grant_priv='Y' 只代表能授权,不代表有其他操作权限;Super_priv='Y' 是超级用户标志,但 MySQL 8.0+ 已拆分为细粒度动态权限,该字段仅保留兼容性。
-
max_questions、max_updates等资源限制字段为 0 表示不限制,不是“没权限” -
ssl_type、plugin字段为空或mysql_native_password不影响权限判断,但会影响登录能力 - MySQL 5.7 中
password字段存哈希值;8.0+ 改为authentication_string,字段名变了,别找错列
用 SELECT 查 mysql.user 时权限字段要显式过滤
直接 SELECT * FROM mysql.user 返回太多冗余列,且布尔字段显示为 Y/N 容易看花眼。应聚焦关键字段,并用 WHERE 排除无效账号。
SELECT User, Host, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, Super_priv FROM mysql.user WHERE User = 'admin' AND Host = '%';
注意:Host 用 % 匹配所有主机,但实际权限检查是精确匹配(比如 'admin'@'192.168.1.%' 不会被 '%' 覆盖),所以查的时候一定要用和登录时完全一致的 Host 值。
- 查询前需有
SELECT权限在mysql库,普通用户默认没有,只有root或带SELECT ON mysql.*的账号能查 - MySQL 8.0+ 默认禁用
SELECT直接查mysql.user,需先执行SET SQL_MODE=''或确保 sql_mode 不含STRICT_TRANS_TABLES等限制 - 字段值大小写敏感:
'Y'是启用,'N'是禁用,NULL在部分旧版本中表示未初始化,不可当作'N'处理
全局权限 ≠ 能操作所有库,注意 DEFINER 和存储过程的陷阱
即使用户拥有 ALL PRIVILEGES ON *.*,在调用 DEFINER 存储过程或函数时,仍以定义者的权限执行。也就是说,全局权限不会自动穿透到 definer 模式下的上下文。
另一个常被忽略的点:全局权限不包含对 INFORMATION_SCHEMA 和 PERFORMANCE_SCHEMA 的访问控制——这两个库的可见性由启动参数和系统变量(如 show_compatibility_56)控制,和用户权限表无关。
- 触发器、事件、视图的权限检查也依赖
DEFINER,不是调用者权限 -
FLUSH PRIVILEGES必须在修改mysql.user表后执行,否则变更不生效;但用GRANT语句改权限则无需手动刷新 - MySQL 8.0.16+ 引入了
ROLE权限模型,全局权限可绑定到 role 再授予用户,此时查mysql.role_edges和mysql.default_roles才能厘清真实权限链
权限这事,越往深里走越得盯着「谁在什么上下文下执行」——不是表里标了 Y 就万事大吉,也不是 SHOW GRANTS 一行没看见就断定没权。动态权限、DEFINER、role 绑定,这三个地方最容易漏看。











