首页/数据/数据库速查/REVOKE 回收权限与账号降级

REVOKE 回收权限与账号降级

回收权限使用 REVOKE 语法与授权对称;回收全部权限账号仍存在(需另行 DROP),权限变更后要核实实际生效。

数据库速查数据更新于 2026-10-13

REVOKE 是什么

REVOKE 用来回收权限,语法与 GRANT 对称:收回哪个权限、作用在哪个对象、针对哪个账号。一个常见误解是「REVOKE ALL 之后账号就没了」——实际上账号仍然存在,只是没有任何权限,真要删除账号必须用 DROP USER。回收完成后应当用 SHOW GRANTS 核实实际生效的权限集合。

基本信息

用途回收权限与账号降级
语法REVOKE 权限 ON 对象 FROM 'user'@'host'
常见误解REVOKE ALL 不会删除账号,只是权限清零
生效方式GRANT/REVOKE 会自动刷新内存权限表,无需刷新
核实命令SHOW GRANTS FOR 'user'@'host'

典型使用场景

  • 业务下线后回收对应账号的写权限
  • 临时提权完成后及时收回,避免权限长期敞口
  • 审计要求最小权限时做账号降级
  • 误授权限后的紧急修复
  • 人员或账号交接后的权限复核

回收示例

回收示例
REVOKE INSERT, UPDATE, DELETE ON appdb.* FROM 'app'@'10.0.%';
REVOKE SELECT ON appdb.orders FROM 'readonly'@'%';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app'@'10.0.%';
SHOW GRANTS FOR 'app'@'10.0.%';        -- 核实回收结果
SELECT user, host FROM mysql.user WHERE user='app';
-- 确认无人使用后再删除账号(不可逆)
-- DROP USER 'app'@'10.0.%';

操作与结果

操作结果注意事项
REVOKE 单个权限从指定对象收回该权限权限名与对象必须与授权时一致
REVOKE ALL PRIVILEGES回收全部权限账号依然存在,需另行删除
REVOKE GRANT OPTION不能再把权限转授他人最常被遗漏的一项
SHOW GRANTS查看当前权限回收后必须复核
DROP USER删除账号不可逆,先确认没有业务在用
正常的 GRANT 与 REVOKE 会自动更新内存中的权限表,不需要执行 FLUSH PRIVILEGES;只有手工修改过系统表,才需要额外刷新一次。看到别人习惯性加上这条命令不必惊讶,但要清楚它在这里并非必需。
不要用 DELETE 直接改 mysql.user 表来回收权限:在较新版本上已不可靠,还容易留下权限缓存与时序问题,账号操作必须走 DDL 语句。
回收前先保存一份 SHOW GRANTS 的输出:既是变更凭证,也方便出问题时快速还原成原来的权限组合。生产账号的权限变更要走审批流程,并记录执行人、时间与变更前后的差异。

易错点

  • REVOKE 的权限与对象跟授予时不匹配:报错或者漏回收,权限实际还在
  • 以为 REVOKE ALL 就删掉了账号:账号还活着,仍可能被猜密码登录
  • 用 DELETE 改系统表回收权限:在新版本上行为不可靠
  • 回收后不复核:实际权限与预期不一致却长期无人发现
  • 账号与主机名是两个维度:只回收了一个 host,另一个 host 上的同名账号权限依然生效

数据来源与参考

  • MySQL 8.0 Reference Manual: REVOKE Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌