USAGE权限不可撤销,它是MySQL创建用户时自动赋予的默认连接权限,仅表示可登录且无任何操作能力;执行REVOKE USAGE会报ERROR 1141,因该权限未真实授予,仅是系统占位符。

USAGE权限不能被显式撤销,因为它不是“真实权限”
MySQL里的USAGE权限本质是占位符,不是可授/可撤的实际操作权限。当你执行CREATE USER 'u'@'%' IDENTIFIED BY 'pwd';,MySQL自动赋予该用户USAGE ON *.*——这仅表示“允许连接”,不附带任何数据库操作能力。它不存于mysql.db或mysql.tables_priv等权限表中,只在mysql.user里以空权限集形式体现。
执行REVOKE USAGE会报错ERROR 1141
直接运行REVOKE USAGE ON *.* FROM 'u'@'%';一定会失败,报ERROR 1141 (42000): There is no such grant defined for user 'u' on host '%'。这不是语法错误,而是MySQL明确告诉你:这个“权限”根本没被真正授予过,只是系统默认状态,无法反向移除。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
想让用户彻底无权,得删用户或清空其所有显式权限
如果你的目标是让某个用户连登录都不允许,只有两个干净做法:
- 用
DROP USER 'u'@'%';物理删除用户(推荐,彻底) - 如果必须保留账号,就逐级撤销所有你曾经
GRANT过的权限:REVOKE ALL PRIVILEGES ON *.* FROM 'u'@'%';+REVOKE GRANT OPTION ON *.* FROM 'u'@'%';,再确认mysql.user中该用户的authentication_string非空且account_locked为N(否则可能因密码失效或锁账户导致无法登录)
容易忽略的细节:匿名用户和localhost匹配优先级
即使你删了'u'@'%',如果还存在'u'@'localhost'或空用户名的匿名用户(''@'localhost'),MySQL仍可能按主机名匹配顺序允许登录。务必用SELECT User, Host FROM mysql.user;查全量用户,并用DROP USER清理掉所有冗余条目。生产环境里,一个用户只留一条明确Host的记录最安全。

















