不能,REVOKE ALL PRIVILEGES 仅撤销当前作用域的显式授权,不包含 GRANT OPTION、USAGE 连接权、全局管理权限及角色绑定,需分层执行 REVOKE 和 DROP USER 才能彻底清空。

REVOKE ALL PRIVILEGES 能否一次性清空用户所有权限?
不能,REVOKE ALL PRIVILEGES 本身不包含 GRANT OPTION,也不会撤销数据库级、表级或列级的显式授权——它只撤销当前作用域下已授予的权限类型。比如你在 mydb.* 上执行了 REVOKE ALL PRIVILEGES ON mydb.* FROM 'u1'@'%',它不会动 mysql.user 表里的全局权限,也不会影响 mydb.t1 上单独授过的 SELECT 权限。
常见错误现象:REVOKE ALL PRIVILEGES ON *.* FROM 'u1'@'%' 执行后,用户仍能连上并查 information_schema,甚至还能用 SHOW DATABASES——因为 MySQL 默认允许所有用户访问 information_schema,且 USAGE 权限(连接权)不会被 ALL PRIVILEGES 覆盖,必须显式 revoke。
-
REVOKE ALL PRIVILEGES, GRANT OPTION ON *.* FROM 'u1'@'%'是更接近“清空”的写法,但依然不等于“完全剥夺” - 如果用户有
CREATE USER、RELOAD等全局管理权限,它们属于mysql.user表的字段,REVOKE不处理这些,得靠DROP USER或手动 UPDATE - MySQL 8.0+ 引入了角色(ROLE),若权限通过角色赋予,
REVOKE ALL不会自动解除角色绑定
真正快速撤销全部权限的实操路径
所谓“快速”,不是靠一条命令,而是按权限粒度逐层清理。核心是:先收连接权(USAGE),再清显式授权,最后处理元数据和角色。
- 先执行
REVOKE ALL PRIVILEGES, GRANT OPTION ON *.* FROM 'u1'@'%',覆盖全局作用域 - 再逐库执行
REVOKE ALL PRIVILEGES, GRANT OPTION ON `db_name`.* FROM 'u1'@'%'(注意反引号包裹数据库名,防关键字冲突) - 显式撤销
USAGE:REVOKE USAGE ON *.* FROM 'u1'@'%'—— 这步关键,否则用户仍可登录(仅限空权限连接) - MySQL 8.0+ 必须检查角色:
SELECT * FROM mysql.role_edges WHERE TO_HOST = '%';,若有匹配,用DROP ROLE或REVOKE role_name FROM 'u1'@'%'
执行完记得 FLUSH PRIVILEGES,否则变更不生效——尤其在直接操作 mysql 系统表后。
为什么 DROP USER 比 REVOKE 更彻底?
因为 DROP USER 'u1'@'%' 不仅删掉 mysql.user 记录,还自动清理关联的 mysql.db、mysql.tables_priv、mysql.role_edges 等所有权限记录,不留死角。
使用场景:批量清理测试账号、离职人员账号、或权限混乱到无法厘清来源时。但要注意:
-
DROP USER无法回滚,且会中断该用户所有活跃连接 - 如果用户正被其他账号
SET DEFAULT ROLE引用,MySQL 8.0 会报错ERROR 3798 (HY000): Cannot drop a user that is currently logged in(实际是角色依赖报错,非登录态) - 5.7 及以下版本不支持
DROP USER IF EXISTS,需先SELECT判断是否存在
容易被忽略的兼容性坑
MySQL 5.7 和 8.0 在权限模型上有本质差异:5.7 的 GRANT OPTION 是独立权限位,8.0 改为“可委托性”属性,且默认关闭;8.0 新增的 SYSTEM_USER、BACKUP_ADMIN 等管理权限,REVOKE ALL PRIVILEGES 完全不触碰。
- 跨版本迁移脚本时,别假设
REVOKE ALL ON *.*在两边效果一致 -
SHOW GRANTS FOR 'u1'@'%'输出结果在 8.0 里可能带AS 'role_name',说明权限来自角色,单纯REVOKE用户本身无效 - 某些云 MySQL(如阿里云 RDS、腾讯云 CDB)禁用
DROP USER或限制mysql表直写,只能走控制台或白名单命令
权限这东西,没有“一键归零”的银弹。最稳的方式永远是:先 SHOW GRANTS 看清现状,再按作用域分层 revoke,最后用 DROP USER 收尾——尤其是你不确定有没有人偷偷给过 PROXY 权限或者改过 max_connections 这类资源限制的时候。


















