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