<p>必须和原始权限一起执行,不能单独回收GRANT OPTION;它依附于具体授权,仅执行REVOKE GRANT OPTION会报错ERROR 1141,须复刻原GRANT结构如REVOKE SELECT, INSERT ON test.* FROM 'u1'@'%'才能同时清除权限及转授权。</p>
REVOKE GRANT OPTION必须和原始权限一起执行
mysql 不支持单独回收 grant option,它不是独立权限项,而是依附于某条具体授权的属性。如果你只运行 revoke grant option on *.* from 'user'@'host';,会报错 error 1141 (42000): there is no such grant defined —— 因为系统找不到一条“只有 grant option、不带其他权限”的授权记录。
实操必须复刻当初 GRANT 的完整结构:
- 如果原始授权是
GRANT SELECT, INSERT ON test.* TO 'u1'@'%' WITH GRANT OPTION;,那就得用REVOKE SELECT, INSERT ON test.* FROM 'u1'@'%'; - 这条语句会同时清除权限和对应的
GRANT OPTION,无需额外操作 - 若用户在多个库或表上有带
WITH GRANT OPTION的授权,每一条都得单独REVOKE
别漏掉不同 host 的同名用户
权限按 'user'@'host' 元组独立存储。'admin'@'localhost' 和 'admin'@'%' 是两个完全不同的账号,权限互不影响。
常见错误是只对 'user'@'%' 执行 REVOKE,但用户实际从 localhost 连接,仍保有 GRANT OPTION。
先查清所有匹配用户:
立即学习“PHP免费学习笔记(深入)”;
SELECT User, Host FROM mysql.user WHERE User = 'user';
再逐个处理:
REVOKE INSERT ON *.* FROM 'user'@'localhost';REVOKE INSERT ON *.* FROM 'user'@'192.168.1.%';- 不能用通配符简写,
'user'@'%.example.com'和'user'@'db.example.com'也需分别处理
MySQL 8.0+ 中 SUPER 权限已废弃,别混淆 GRANT OPTION 和动态特权
GRANT OPTION 控制的是“授予权限的能力”,而真正让用户能执行高危操作(如修改全局变量、杀线程、启停复制)的是 SYSTEM_VARIABLES_ADMIN、CONNECTION_ADMIN 等动态权限,它们和 GRANT OPTION 无关。
如果你发现撤销 GRANT OPTION 后用户还能执行 KILL 或 SET GLOBAL,说明他仍持有这些动态权限:
- 查当前权限:
SHOW GRANTS FOR 'user'@'host'; - 逐个回收:
REVOKE SYSTEM_VARIABLES_ADMIN, CONNECTION_ADMIN ON *.* FROM 'user'@'host'; - 注意:MySQL 8.0+ 中直接
REVOKE SUPER会报错ERROR 3715,该权限已语义移除
回收后权限不会自动同步到已存在的连接
REVOKE 命令立即生效,但已建立的客户端连接仍维持旧权限,直到断开重连或被 KILL。
验证是否生效,不能只看 SHOW GRANTS 输出,要实际测试:
- 让目标用户新建连接再试
GRANT操作,确认报错ERROR 1045 (HY000): Access denied - 检查活跃连接:
SHOW PROCESSLIST;,找到对应User和Host的线程 ID,执行KILL [id]; - 生产环境慎用
KILL,建议通知用户主动重连
最易忽略的一点:角色(ROLE)可能间接赋予 GRANT OPTION。如果用户被 GRANT myrole TO 'user'@'host';,且该角色本身有带 WITH GRANT OPTION 的授权,那仅 revoke 用户本身权限无效,还得查 SHOW GRANTS FOR 'user'@'host' USING 'myrole'; 并对角色执行对应 REVOKE。



















