在 MySQL 中撤销用户权限,核心是使用 REVOKE 语句。它不是删除用户,而是精准移除已授予的访问能力,比如禁止某人读某库、写某表,或收回管理权。操作前需确保你拥有
GRANT OPTION权限,且用户名@主机名必须与当初
GRANT时完全一致。
明确要撤销的权限范围
权限作用域分四层:全局(
*.*)、数据库级(
db_name.*)、表级(
db_name.table_name)、列级(需显式指定列)。撤销时必须匹配原授权粒度。 想停掉用户对整个
sales库的操作?用
REVOKE ALL PRIVILEGES ON sales.* FROM 'user1'@'192.168.1.%';只禁读,保留写?写
REVOKE SELECT ON app.users FROM 'api_user'@'localhost';回收创建数据库的全局权限?写
REVOKE CREATE ON *.* FROM 'dev'@'%';
注意 GRANT OPTION 要单独处理
ALL PRIVILEGES不包含
GRANT OPTION,这是独立权限。如果用户曾被允许转授权限,必须额外撤销:
REVOKE GRANT OPTION ON *.* FROM 'manager'@'localhost';若要一次性清空所有权限(含转授权),应写成:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'manager'@'localhost';
执行后务必验证并刷新
撤销命令执行成功不代表立即生效——尤其在高并发或权限缓存较深的环境中。
先运行FLUSH PRIVILEGES;强制重载权限表 再用
SHOW GRANTS FOR 'user1'@'localhost';确认结果。输出里不应再出现刚撤销的权限项 若提示“Unknown user”,说明用户名@主机名拼写有误;若报“Access denied”,是你当前登录账户缺乏
GRANT OPTION
安全操作建议
生产环境执行前建议做三件事:
用SELECT User, Host, Select_priv, Insert_priv, ... FROM mysql.user WHERE User = 'xxx';快速查该用户当前全局权限状态 在测试库上先复现相同授权结构,验证 REVOKE 语句语法无误 避免使用
REVOKE ... FROM 'user'@'%'这类宽泛主机名,除非确认该用户仅此一条记录;否则可能误撤其他同名但不同主机的账号权限
