如何查看 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.%';<br>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更可靠。
