mysql中的SHOW GRANTS查看用户权限

来源:这里教程网 时间:2026-02-28 20:48:41 作者:

SHOW GRANTS 只显示当前用户权限,不查其他用户

执行

SHOW GRANTS
不带参数时,默认只返回当前登录用户的权限列表,不是所有用户,也不是 root 的权限。想查别人,必须显式指定用户,否则容易误判权限范围。

查当前用户:
SHOW GRANTS;
查指定用户:
SHOW GRANTS FOR 'username'@'host';
(注意
'username'@'host'
必须和
mysql.user
表里记录完全一致,包括引号)
如果提示
Access denied
,说明你没被授予
SELECT
权限访问
mysql.user
表,或没
SHOW GRANTS
权限本身

输出结果里 IDENTIFIED WITH 是认证插件,不是权限

SHOW GRANTS
返回的每条语句开头常有类似
GRANT USAGE ON *.* TO 'u1'@'%' IDENTIFIED WITH caching_sha2_password AS '$A$...' 
这样的内容。这里的
IDENTIFIED WITH
表示该用户使用的身份验证插件和密码哈希方式,和授权无关,别把它当成某类“USAGE 权限”的体现。

USAGE
本身代表“无任何数据库级权限”,仅允许连接,常作为占位符出现在
CREATE USER
后的默认输出中
真正有效的权限从下一行的
GRANT SELECT, INSERT...
开始算
如果只看到
GRANT USAGE
,基本等于这个用户目前啥也干不了

权限未生效?检查是否执行了 FLUSH PRIVILEGES

通过直接修改

mysql.user
mysql.db
表(比如用
UPDATE
)来改权限后,
SHOW GRANTS
可能仍显示旧结果——因为 MySQL Server 缓存了权限数据,需要手动刷新。

改表后必须执行:
FLUSH PRIVILEGES;
GRANT
/
REVOKE
语句改权限则自动刷新,无需再
FLUSH
如果
SHOW GRANTS
和你刚执行的
GRANT
不一致,先确认是否在正确的 host 上登录(比如
'user'@'localhost'
'user'@'%'
是两个不同账号)

SHOW GRANTS 输出不能直接复用为 GRANT 语句

虽然

SHOW GRANTS
返回的是类 SQL 的字符串,但多数情况下不能原样复制粘贴去执行。常见问题包括:

输出中可能含
WITH GRANT OPTION
,但目标用户未必有该能力;若强行执行会报错
ERROR 1045 (28000): Access denied
某些版本输出带反斜杠转义(如
\_
),直接运行会语法错误
权限作用域(如
ON `db`.`tbl`
)里的反引号在低版本 MySQL 中不被识别,需手动去掉
更稳妥的做法是用
mysqldump --no-data --skip-triggers --compact mysql user db tables_priv
导出权限元数据
mysql> SHOW GRANTS FOR 'app_user'@'10.20.%';
+---------------------------------------------------------------------+
| Grants for app_user@10.20.%                                         |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'10.20.%'                         |
| GRANT SELECT, UPDATE ON `orders`.* TO 'app_user'@'10.20.%'          |
| GRANT INSERT ON `logs`.* TO 'app_user'@'10.20.%' WITH GRANT OPTION |
+---------------------------------------------------------------------+

权限细节藏在每一行的

ON
后面的作用域和逗号分隔的权限名里,而不是整条语句看起来那样“完整”。漏看一个
`
、少扫一眼
@'host'
,就可能配错环境。

相关推荐