mysql中查看与修改用户权限的技巧

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

如何查看 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
更可靠。

相关推荐