revoke命令用于收回用户权限,核心结构是“收回权限、在对象上、从用户”,顺序不可颠倒;需注意权限不立即生效、all privileges不含grant option、角色应优先用revoke role_name from user,且操作不可逆。
不能直接“撤销已执行的操作”,只能收回用户后续访问数据库的权限。关键不是点几下界面,而是确认权限作用域、匹配准确的 user@host 元组,并刷新生效。
先查清用户实际拥有的权限
界面显示容易漏掉隐式权限或角色继承,必须用 SQL 确认真实授权状态:
- 在 phpMyAdmin 的「SQL」标签页执行:
SHOW GRANTS FOR 'username'@'host';—— 注意引号和 host 必须与创建时完全一致(比如'app'@'%'和'app'@'192.168.1.5'是两个独立账户) - 若返回包含
GRANT ALL PRIVILEGES ON *.*或ON database_name.*,说明权限是全局或库级授予的,REVOKE必须对应相同范围 - MySQL 8.0+ 用户可能通过角色获得权限,需额外查
SELECT * FROM mysql.role_edges WHERE TO_HOST = 'host' AND TO_USER = 'username';
用 REVOKE 精确回收库级权限
图形界面的「编辑权限」只适合单库少量操作,批量或跨库回收务必用 SQL,避免勾选遗漏:
- 撤销某库全部权限:
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host'; - 只撤读写权限,保留结构权限(如 ALTER):
REVOKE SELECT, INSERT, UPDATE, DELETE ON database_name.* FROM 'username'@'host'; - 如果用户有
GRANT OPTION,必须一并收回:REVOKE GRANT OPTION ON database_name.* FROM 'username'@'host'; - 执行后必须跟
FLUSH PRIVILEGES;,否则变更不生效(动态权限除外)
注意 Host 匹配和权限残留风险
权限按 User@Host 元组存储,改错 host 就等于没动真权限:
- 常见错误:只改了
'user'@'%',但用户实际用'user'@'10.0.2.100'连接,后者权限不受影响 - 检查所有匹配记录:
SELECT User, Host FROM mysql.user WHERE User = 'username'; - 某些旧版 MySQL 允许
Host = '0.0.0.0'或'*',它们和'%'效果类似,需一并处理 - 撤销后用户仍能连上并执行语句?大概率是连接未断开复用了旧会话,建议
KILL对应线程或让客户端重连
真正难的不是执行那条 REVOKE,而是确认你撤销的是用户**正在用的那一条** User@Host,而不是你以为的那条。权限系统没有“默认匹配”逻辑,只有精确元组匹配。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











