不能。mysql.user表仅存全局权限字段(如select_priv),mysql 8.0+已将execute等权限移至数据字典,且不包含库级、表级、列级及角色继承权限;show grants才真实反映合并后的生效权限。

直接查 mysql.user 表能看到完整权限吗?
不能。MySQL 8.0+ 的 mysql.user 表里,大部分权限字段(如 Select_priv、Insert_priv)只反映全局级别权限,且从 8.0 开始,很多权限(比如 EXECUTE、CREATE VIEW)已移出该表,改由数据字典视图管理。直接 SELECT * FROM mysql.user 会漏掉库级、表级、列级权限,也看不到角色(ROLE)赋予的权限。
用 SHOW GRANTS 查单个用户的实际生效权限
这是最可靠、最贴近运行时权限的方式,它会合并用户自身权限 + 所属角色权限 + 显式授予的各级权限:
-
SHOW GRANTS FOR 'username'@'host';—— 查指定用户 -
SHOW GRANTS FOR CURRENT_USER();—— 查当前连接用户(注意不是USER()) - 结果里每条
GRANT ... ON ... TO ...都是真实生效的授权语句,可直接复用或审计 - 如果用户有角色,
SHOW GRANTS会自动展开角色内含的权限(前提是角色已激活)
想批量导出所有用户权限清单?得组合多个查询
没有一键命令,必须拼接:
- 全局权限:查
mysql.user(仅 5.7 或需兼容旧版时参考),但 8.0+ 更推荐information_schema.role_table_grants+information_schema.role_routine_grants - 库级权限:查
mysql.db表(字段如Db、Select_priv) - 表级权限:查
mysql.tables_priv(注意Table_name是加密存储的,需用FROM_BASE64解码) - 角色分配:查
mysql.role_edges(FROM_HOST是角色名,TO_HOST是被授角色的用户) - 更稳妥的做法是写脚本循环执行
SHOW GRANTS FOR ...,把结果重定向保存,避免遗漏动态权限或上下文限制
mysql.user 表字段哪些还值得看?
在 MySQL 8.0 中,mysql.user 主要剩这些关键字段,其他多数已弃用或恒为 N:
-
User和Host:唯一标识用户账户 -
authentication_string:密码哈希(别误以为是明文) -
account_locked:是否锁定(Y/N) -
password_expired:密码是否过期 -
max_questions/max_updates等资源限制字段仍有效 -
ssl_type、x509_issuer:TLS/SSL 认证配置
别再依赖 Super_priv 或 Grant_priv 判断权限高低——它们只是开关,不反映实际授权范围。











