REVOKE ALL仅撤销权限而不删除用户,用户仍可凭密码连接(因保留USAGE权限);彻底禁用须用DROP USER或ALTER USER ... ACCOUNT LOCK,并验证mysql.user表及实际登录效果。

REVOKE ALL 只撤销权限,不删用户
REVOKE ALL 的作用范围仅限于权限(privileges),它不会触碰用户账户本身。MySQL 的用户身份由 mysql.user 表中的记录定义,而权限只是该记录里的字段(如 Select_priv、Insert_priv 等)。执行 REVOKE ALL ON *.* FROM 'user'@'host' 后,那些权限字段会被设为 N,但该行记录依然存在,user 仍能连接(只要密码正确且账户未被锁)。
真正删除用户得用 DROP USER
要彻底移除一个用户及其所有关联记录(包括 mysql.user、mysql.db、mysql.tables_priv 等表中的条目),必须显式执行:
DROP USER 'user'@'host';这个语句会原子性地清理所有用户级元数据。注意:
-
DROP USER在 MySQL 5.7+ 是默认行为;5.6 及更早版本需配合FLUSH PRIVILEGES才生效 - 不能省略主机名部分 ——
'user'@'%'和'user'@'localhost'是两个独立用户 - 如果用户正有活跃连接,
DROP USER不会中断它们,但新连接会被拒绝
常见误操作:只 REVOKE 没 DROP,结果用户还能登录
典型错误场景是运维同学执行了 REVOKE ALL PRIVILEGES ON *.* FROM 'app_user'@'10.20.30.%',以为“清空权限=废掉账号”,结果发现该用户仍能连上 MySQL 并执行 SELECT USER() 或 SHOW DATABASES(因为 USAGE 权限是隐式存在的,且不被 REVOKE ALL 影响)。真正限制登录的只有:
- 账户被
ALTER USER ... ACCOUNT LOCK锁定 - 密码过期或为空(取决于
default_password_lifetime和认证插件) - 用户记录被
DROP USER删除
权限清理后建议手动验证
执行 REVOKE 或 DROP USER 后,别只信命令返回 “Query OK”,应立刻查证:
- 检查
mysql.user表:SELECT User, Host, authentication_string, account_locked FROM mysql.user WHERE User = 'user';
- 用目标用户连接测试:
mysql -u user -h target_host -p
,观察是否报Access denied还是成功登录 - 若使用 Percona 或 MariaDB,注意
mysql.proxies_priv表也可能残留代理权限,需单独清理
权限系统和用户生命周期是两层事——把人请出房间(DROP USER)和收走他手里的钥匙(REVOKE)不是一回事,漏掉哪一层都可能留下隐患。


















