SHOW GRANTS 是查看当前或指定用户显式权限的直接方式,不包含角色权限和隐式继承;需注意 host 匹配、MySQL 8.0+ 权限与认证分离,且 GRANT/REVOKE 后无需 FLUSH PRIVILEGES。

如何查看 MySQL 当前用户的权限
执行 SHOW GRANTS 是最直接的方式,它显示当前登录用户(或指定用户)被显式授予的权限。注意:它不合并角色权限(MySQL 8.0+ 角色功能启用时),也不反映隐式继承关系。
- 查看自己拥有的权限:
SHOW GRANTS;
- 查看其他用户(需
SELECT权限在mysql.user表,或GRANT OPTION):SHOW GRANTS FOR 'username'@'host';
- 若提示
Access denied,说明你没有足够权限读取授权表,此时无法绕过 —— MySQL 不允许低权限用户探测他人权限
修改用户权限前必须先确认 host 匹配规则
MySQL 用户由 'username'@'host' 元组唯一标识。'user1'@'localhost' 和 'user1'@'127.0.0.1' 是两个完全不同的账户,权限互不影响。常见误操作是改错了 host 导致权限没生效。
- 查清目标用户真实 host:
SELECT User, Host FROM mysql.user WHERE User = 'username';
- host 值可能是
'%'(通配所有主机)、'localhost'(仅 Unix socket 或本地 TCP)、'192.168.1.%'等;注意localhost不等价于127.0.0.1(前者优先走 socket) - 新建或修改权限时,务必用完全一致的
Host值,否则会创建新用户而非更新旧用户
GRANT 和 REVOKE 后必须执行 FLUSH PRIVILEGES 吗
不需要。在绝大多数情况下,GRANT、REVOKE、DROP USER、CREATE USER 这些语句会自动刷新权限缓存。只有当你**直接 UPDATE 或 INSERT 到 mysql.user 等系统表**时,才需要手动执行 FLUSH PRIVILEGES。
- 正确做法(自动生效):
GRANT SELECT, INSERT ON mydb.* TO 'appuser'@'10.0.2.%';
- 错误做法(多余且可能掩盖问题):
GRANT SELECT ON mydb.* TO 'appuser'@'10.0.2.%';
FLUSH PRIVILEGES; - 例外:如果你用
UPDATE mysql.user SET authentication_string = ...直接改密码字段,就必须FLUSH PRIVILEGES,但这是反模式,应改用ALTER USER
MySQL 8.0+ 修改密码与权限分离更严格
从 MySQL 8.0 开始,password 字段已移除,认证方式统一由 authentication_string 和 plugin 控制。用 GRANT 不能再顺带改密码;必须用 ALTER USER 单独处理。
- 只改权限:
GRANT UPDATE ON sales.* TO 'reporter'@'%';
- 只改密码:
ALTER USER 'reporter'@'%' IDENTIFIED BY 'newpass123';
- 同时改密码和权限?不行 —— 必须分两步,且
ALTER USER不接受权限参数 - 如果执行
GRANT ... IDENTIFIED BY会报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT
实际运维中,最容易卡住的是 host 匹配失败和混淆了 8.0 的权限/认证分离机制。改完权限立刻用对应 host 连接测试,比看 SHOW GRANTS 更可靠。










