直接执行SHOW GRANTS;即可查看当前账号全部显式权限,它默认作用于CURRENT_USER(),不依赖数据库上下文;若仅显示GRANT USAGE ON .,说明无实际权限;查他人权限须严格匹配'user'@'host'格式并具备相应权限。

升级后直接执行 SHOW GRANTS 看当前账号权限
MySQL 8.4 启动完成且能正常连接后,立刻用目标账号登录,执行 SHOW GRANTS; 即可看到该账号当前生效的全部显式权限。它不依赖任何数据库上下文,也不需要提前 USE mysql,连上就跑,结果最真实。
常见误操作:连上后先 USE mysql 再查,或以为要加 FOR CURRENT_USER()——其实 SHOW GRANTS; 默认就是查 CURRENT_USER(),多写反而冗余。
- 如果只看到
GRANT USAGE ON *.* TO 'xxx'@'%',说明该账号确实没被授过任何实际权限,不是命令失效 - 若报错
ERROR 1045 (28000),问题不在SHOW GRANTS,而是登录阶段认证失败(比如插件不匹配、密码错误或 host 不符) - 输出中
ON `db_name`.*表示库级权限,ON `db_name`.`table_name`是表级,ON *.*才是全局——别光扫一眼“GRANT”就认为有所有权限
查别人权限必须用完整 'user'@'host' 格式
在 MySQL 8.4 中,SHOW GRANTS FOR 'user'; 一定会报错 ERROR 1141 (42000),因为权限系统严格按 User@Host 组合索引匹配,缺一不可。
正确做法是先查账号注册信息:SELECT User, Host FROM mysql.user WHERE User = 'target_user';,复制结果中带单引号的完整字符串(如 'app'@'10.20.%'),再粘贴进 SHOW GRANTS FOR。
- 注意大小写和空格:
'APP'@'%'和'app'@'%'是两个用户;'app'@'localhost '(末尾空格)会查不到 - 执行
SHOW GRANTS FOR查他人权限,需你当前账号具备SUPER权限,或对mysql.user表有SELECT权限,否则直接拒绝 - MySQL 8.4 已完全弃用
password字段,改用authentication_string,但查权限时无需碰这个字段
验证角色权限不能只靠 SHOW GRANTS
MySQL 8.4 默认启用角色机制,用户通过 SET ROLE 或默认角色获得的权限,SHOW GRANTS 默认不展开显示,只显示显式授予的权限。
要确认角色是否激活、继承了哪些权限,必须组合查询:SELECT * FROM mysql.role_edges WHERE FROM_HOST = '%' AND FROM_USER = 'target_user';,再根据返回的角色名查对应权限:SHOW GRANTS FOR 'role_name'@'%';。
- 如果用户绑了多个角色,权限是叠加的,没有“覆盖”逻辑;但任一角色被
REVOKE,对应权限立即失效 -
SHOW GRANTS USING 'role_name';可临时切换上下文查看该角色赋予的权限,但不会改变当前会话实际权限 - 动态权限(如
BACKUP_ADMIN、CLONE_ADMIN)在SHOW GRANTS输出中单独成行,且只出现在ON *.*后,不混在普通权限列表里
权限表结构已稳定,但别跳过 FLUSH PRIVILEGES 验证
MySQL 8.4 升级过程由 mysqld --upgrade=FORCE 自动完成系统表迁移,mysql_upgrade 工具已被彻底移除。这意味着权限表结构本身通常无需手动修复,但内存缓存可能滞后。
尤其当你在升级后手动修改过 mysql.user 或其他权限表(不推荐),或发现权限行为与 SHOW GRANTS 输出不符时,执行 FLUSH PRIVILEGES; 强制重载是最快验证手段。
-
FLUSH PRIVILEGES在 MySQL 8.4 中仍是安全操作,不会中断连接,也不会清空缓存中的其他数据 - 它只刷新权限相关内存结构,不影响查询缓存、InnoDB buffer pool 等
- 如果执行后权限仍未生效,问题大概率出在认证插件(如
caching_sha2_password兼容性)或客户端连接参数(如未设--default-auth=mysql_native_password)
真正容易被忽略的是 host 匹配精度和角色激活状态——CURRENT_USER() 返回的 'user'@'host' 才是权限判定依据,而 USER() 只是你声明的连接方式;角色权限不自动展开,必须主动查 role_edges 或用 USING 显式指定。


















