MySQL中回收用户权限用REVOKE语句,需严格匹配授权时的用户名@host,语法为REVOKE权限ON库表FROM用户;回收后需FLUSH PRIVILEGES生效,且不删除账号、不撤销角色权限。

MySQL 中回收用户权限用 REVOKE 语句,核心是明确“谁、在哪个库表、撤回什么权限”。它和 GRANT 对应,但不能撤销不存在的权限,也不能跨主机撤销(需指定完全匹配的用户名@host)。
基本语法与常用形式
REVOKE 后跟权限类型,ON 指定作用范围,FROM 指定用户:
-
回收单个权限:
REVOKE SELECT ON mydb.users FROM 'alice'@'localhost'; -
回收多个权限:
REVOKE INSERT, UPDATE ON mydb.orders FROM 'bob'@'%'; -
回收所有权限(除 GRANT OPTION):
REVOKE ALL PRIVILEGES ON mydb.* FROM 'dev'@'192.168.1.%'; -
回收授权权限本身:
REVOKE GRANT OPTION ON *.* FROM 'admin'@'localhost';
注意作用范围必须严格匹配
GRANT 时用了 'user'@'10.%.%.%',REVOKE 就不能写成 'user'@'%',否则报错 “Unknown table”。MySQL 把不同 host 视为不同用户。
- 查看用户当前权限:用
SHOW GRANTS FOR 'user'@'host';确认实际授予的 host 值 - 不确定 host 时,可查
mysql.user表:SELECT User, Host FROM mysql.user WHERE User = 'xxx'; - 若原授权是
'user'@'localhost',而你执行REVOKE ... FROM 'user'@'%',权限不会被移除
回收后需刷新权限才生效
REVOKE 执行成功只是修改了权限元数据,客户端连接不会自动感知变化。已有连接仍保留旧权限,新连接才会应用新规。
- 执行
FLUSH PRIVILEGES;强制重载权限表(推荐,尤其在直接改 mysql.user 表后) - 或者重启 MySQL 服务(不必要,仅极端情况)
- 注意:普通 REVOKE 后一般不需要 FLUSH,系统会自动同步;但某些版本或特殊配置下建议显式执行一次更稳妥
常见误区与安全提醒
REVOKE 不会删除用户账号,只清权限。想彻底清理,要搭配 DROP USER。
- 不能用 REVOKE 回收“通过角色获得的权限”,得先从角色中撤权,或从用户撤消角色
- 回收
ALL PRIVILEGES不包含GRANT OPTION,要单独 revoke - 对
mysql系统库操作需谨慎,误 revoke root 权限可能导致无法管理 - 生产环境建议先在测试库验证语句,再操作线上










