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 的输出:既是变更凭证,也方便出问题时快速还原成原来的权限组合。生产账号的权限变更要走审批流程,并记录执行人、时间与变更前后的差异。