应使用 DROP USER ''@'localhost' 等命令安全删除匿名用户,而非 DELETE FROM mysql.user,因后者会破坏权限系统;空 user 记录多为旧版本遗留,CREATE USER 不允许新建;删后需 FLUSH PRIVILEGES。

直接删除 user 表中 user 为空的记录会破坏 MySQL 权限系统
不能用 DELETE FROM mysql.user WHERE user = '' 或类似语句直接删,MySQL 8.0+ 启动时会校验 mysql.user 表结构和关键行,空 user 记录虽不推荐,但部分默认安装(尤其旧版本或某些一键包)会留一个用于本地 socket 登录的匿名账户,强行删可能引发启动失败或权限初始化异常。正确做法是用授权命令清理。
用 DROP USER 删除匿名用户(推荐方式)
MySQL 提供了安全删除用户的语法,它会同时清理 mysql.user、mysql.db 等关联权限表,避免残留。匿名用户的典型表现为 User 列为空字符串,Host 通常是 'localhost' 或 '%':
- 先查出来:
SELECT User, Host FROM mysql.user WHERE User = ''; - 逐条删(示例删本地匿名用户):
DROP USER ''@'localhost'; - 如果存在远程匿名用户:
DROP USER ''@'%'; - 执行后必须
FLUSH PRIVILEGES;生效
为什么 CREATE USER 不允许创建空 user,但表里还能有?
这是历史兼容行为:MySQL 5.7 及更早版本允许安装时初始化匿名账户,且 CREATE USER 本身禁止显式创建空 User(会报错 ERROR 1470 (HY000): String ' ' is too long for user name (should be no longer than 32)),但底层表结构仍允许 user 字段为 ''。所以你看到的空用户基本都是遗留的,不是新创建的。
删完还要检查 auth_socket 插件导致的“看似匿名”登录
有些 Linux 发行版(如 Ubuntu)默认用 auth_socket 插件配置 root@localhost,它不校验密码、只认系统用户,容易被误认为是匿名用户。确认方法:SELECT User, Host, plugin FROM mysql.user WHERE User = 'root' AND Host = 'localhost';。如果是 auth_socket,想统一用密码登录,需运行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';,再 FLUSH PRIVILEGES;
真正要清理的是那些既没用户名、又没明确用途的空 User 记录;但删之前务必确认它没被任何应用依赖——比如某些老监控脚本可能硬编码了 -u '' -h localhost 这种调用方式。











