应执行select user, host from mysql.user;检查''@'localhost'等匿名用户、'test'@'%'等测试账号及多余root账号;确认后用drop user if exists(5.7+)或delete+flush privileges(5.6-)清理,并验证current_user()确保无残留。

查清当前有哪些匿名用户和无用账号
先连上 MySQL(需有 SUPER 或 SELECT ON mysql.* 权限),执行:
SELECT User, Host FROM mysql.user;重点关注三类记录:
•
''@'localhost'、''@'127.0.0.1'、''@'::1'(匿名用户)•
'test'@'localhost'、'test'@'%'(测试账号)• 多余的
'root'@'127.0.0.1'、'root'@'::1'、'root'@'%'(除非明确需要远程 root)别漏掉
User IS NULL 的行——极少见,多为表损坏,不建议直接删。
MySQL 5.7+ 应优先用 DROP USER 删除匿名用户
MySQL 5.7 及以后版本支持安全删除,它会同步清理 mysql.db、mysql.tables_priv 等关联权限表,避免残留。
执行前务必确认目标用户确实无业务依赖(比如某些老监控脚本可能硬编码 -u '' -h localhost)。
推荐命令:
DROP USER IF EXISTS ''@'localhost';<br>DROP USER IF EXISTS ''@'127.0.0.1';<br>DROP USER IF EXISTS ''@'::1';<br>DROP USER IF EXISTS 'test'@'localhost';<br>DROP USER IF EXISTS 'test'@'%';每条执行后无需
FLUSH PRIVILEGES,但建议最后统一执行一次确保生效。
MySQL 5.6 或更早版本必须用 DELETE FROM mysql.user
在 5.6 及以前版本,DROP USER ''@'localhost' 会报错 ERROR 1396 (HY000),只能走底层删表方式:
DELETE FROM mysql.user WHERE User = '' AND Host IN ('localhost', '127.0.0.1', '::1');<br>FLUSH PRIVILEGES;注意:• 不要写
User = '' OR User IS NULL,后者风险高•
Host 条件必须收紧,避免误删合法空用户名(极少数监控工具会用)• 删完立刻验证:
SELECT USER(), CURRENT_USER();,如果返回类似 ''@'localhost',说明删得不干净或缓存未刷新
删完还要检查 root 是否被“覆盖”或“伪装”
匿名用户匹配优先级高于 root@localhost。即使你删了 ''@'localhost',如果 root@localhost 的认证插件是 auth_socket(Ubuntu/Debian 常见),客户端仍可能免密登录——但这不是匿名用户没删干净,而是 auth_socket 在起作用。
验证命令:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';若看到
plugin = 'auth_socket',且你想统一用密码登录,运行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_pass';<br>FLUSH PRIVILEGES;真正危险的是:删掉所有匿名用户后,却忘了补全
root@localhost 的密码或插件配置,导致后续完全无法登录。











