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'
,就可能配错环境。

相关推荐