默认测试库包括test、test_%等,匿名账号指mysql.user表中user为空字符串''的记录;需先用select和show确认现状,再用drop user安全删除匿名账号,清理mysql.db中user=''的残留权限,并删除test库。

查清楚哪些是默认测试库和匿名账号
别急着删,先看MySQL里到底有什么。匿名账号在mysql.user表里表现为User列为空字符串'',不是NULL;测试库则通常是test、test_%这类名字,也可能叫tmp或dev开头的库。
执行这两条命令确认现状:
SELECT User, Host FROM mysql.user WHERE User = '';
SHOW DATABASES LIKE 'test%';
注意:如果返回''@'localhost'、''@'127.0.0.1'、''@'::1',都得处理;test库即使没数据也得删,因为默认权限常设为ALL,且mysql.db里可能留着User = ''的记录。
用 DROP USER 安全删匿名账号
DROP USER是唯一推荐方式,它会同步清理mysql.db、mysql.tables_priv等关联权限表。直接DELETE FROM mysql.user会导致权限残留,比如删完还能连test库——这不是没删干净,是mysql.db里还有User = ''的行。
DROP USER ''@'localhost';DROP USER ''@'127.0.0.1';DROP USER ''@'::1';
MySQL 8.0.28+ 某些小版本对''@'localhost'执行DROP USER可能报ERROR 1396 (HY000),此时改用带IF EXISTS的写法:DROP USER IF EXISTS ''@'localhost';
删完不用手动FLUSH PRIVILEGES——DROP USER是 DDL,MySQL 内部自动重载缓存。强行刷反而可能锁表。
顺手清掉 test 库和残留权限记录
删了匿名账号不等于test库就安全了。很多旧版安装或一键包会在mysql.db里埋一条User = ''、Db = 'test%'的记录,只要匹配上,任何空用户名都能进所有test开头的库。
执行这条清理:
DELETE FROM mysql.db WHERE User = '' AND Db IN ('test', 'test\_%') ESCAPE '\';
然后删库本身:
DROP DATABASE IF EXISTS test;
再检查一遍:SELECT User, Db FROM mysql.db WHERE User = '';——结果应为空。
警惕 auth_socket 导致的“假匿名”登录
Ubuntu/Debian 系统默认给root@localhost配的是auth_socket插件,它不校验密码、只认系统用户,看起来像免密登录,容易被当成匿名账号。验证方法:
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_strong_password';
真正要砍的是那些既没用户名、也没明确用途的空User记录;但删之前务必确认有没有老脚本硬编码mysql -u "" -h localhost这种调用——删完就断连,没人告诉你为什么。











