不能,REVOKE ALL PRIVILEGES仅撤销当前作用域的显式授权,不撤销USAGE连接权、GRANT OPTION、全局管理权限及角色绑定,账户仍存在于mysql.user表中,需分层执行REVOKE USAGE、逐级撤销权限并解绑角色,或直接使用DROP USER才能彻底清理。

REVOKE ALL PRIVILEGES 本质是权限操作,不是账户管理操作
REVOKE ALL PRIVILEGES 只作用于权限系统表(如 mysql.db、mysql.tables_priv),它不碰 mysql.user 表里的用户身份记录。只要 User 和 Host 字段还存在,账户就还在——哪怕所有权限字段全为 N,用户仍能用空权限连上 MySQL(因为 USAGE 是隐式连接权,不被 ALL PRIVILEGES 覆盖)。
USAGE 权限不会被 ALL PRIVILEGES 撤销
用户能登录,靠的是 USAGE 权限,它代表“允许连接但无任何操作权”。而 REVOKE ALL PRIVILEGES ON *.* 不包含 USAGE,也不会自动触发它的撤销。常见现象:执行完该语句后,用户仍可执行 SHOW DATABASES 或访问 information_schema——这不是 bug,是设计使然。
-
REVOKE USAGE ON *.* FROM 'u1'@'%'才能真正切断连接能力 - 若只 revoke 全局权限,但没 revoke 库级或表级权限,那些显式授予的权限(如
SELECT ON mydb.t1)依然有效 - MySQL 8.0+ 中通过角色赋权的,
REVOKE ALL PRIVILEGES完全不触碰mysql.role_edges表
真正删用户必须动 mysql.user 表或用 DROP USER
账户元数据只存于 mysql.user 表。要彻底清除账户,只有两条路:
- 用
DROP USER 'u1'@'%'—— 安全、原子、自动清理所有关联权限和角色 - 手动
DELETE FROM mysql.user WHERE User='u1' AND Host='%'+FLUSH PRIVILEGES—— 风险高,易遗漏mysql.db等残留行,且 MySQL 8.0+ 角色绑定需额外处理
注意:DROP USER 在 MySQL 5.7+ 默认级联清理权限,但不会自动 DROP ROLE;若用户被赋予了角色,角色本身仍存在,只是解除绑定。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
为什么有人误以为 REVOKE ALL 能删用户
因为执行 REVOKE ALL PRIVILEGES ON *.* FROM 'u1'@'%' 后,SHOW GRANTS FOR 'u1'@'%' 返回空结果,看起来像“没了”。但:
-
SELECT User, Host FROM mysql.user WHERE User='u1'仍能查到记录 -
mysql -u u1 -p仍可成功登录(仅限空会话) - 如果之前单独授过
SELECT ON test.t,这条权限还在mysql.tables_priv里,REVOKE ALL PRIVILEGES ON *.*对它完全无效
真正的权限清空不是靠“一条命令”,而是分层执行:REVOKE USAGE 切断连接 → REVOKE ALL, GRANT OPTION 清全局/库/表级 → 检查并解绑角色 → 最后 FLUSH PRIVILEGES。










