必须用 DROP USER 删除用户,直接删 mysql.user 表会导致权限残留、缓存不一致及重建同名用户失败;查僵尸账号应使用 performance_schema.accounts 表(需先启用 accounts 消费者),而非依赖 mysql.user 中的 password_last_changed 字段。

必须用 DROP USER,删 mysql.user 表会留权限残留、缓存不一致、重建同名用户失败。
查僵尸账号不能只看 mysql.user
MySQL 不记录“最后登录时间”,mysql.user 里的 password_last_changed 只反映改密动作,不是登录行为。真正能查活跃度的是 performance_schema.accounts 表,但需先启用:
- 确认是否开启:
SELECT VARIABLE_VALUE FROM performance_schema.setup_consumers WHERE NAME = 'accounts';,返回NO就得执行UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'accounts'; - 查 90 天没连过的非系统账号:
SELECT USER, HOST FROM performance_schema.accounts WHERE USER NOT IN ('mysql.session', 'mysql.sys', 'root') AND LAST_SEEN - 注意:
LAST_SEEN是最后一次成功认证时间;新创建但从未登录的账号不会出现在这张表里
识别已锁死但残留的“半死”账号
有些账号被 ALTER USER ... ACCOUNT LOCK 或 REVOKE 后就扔着不管了,它们在 mysql.user 里还留着,但已无法登录。这类账号满足三个条件:
account_locked = 'Y'- 所有基础权限字段(
Select_priv、Insert_priv、Update_priv等)全为'N' -
authentication_string为空、或以*0/*1开头(无效哈希占位符)
执行这句就能揪出来:SELECT User, Host FROM mysql.user WHERE account_locked = 'Y' AND Select_priv = 'N' AND Insert_priv = 'N' AND Update_priv = 'N' AND Delete_priv = 'N' AND Create_priv = 'N' AND Drop_priv = 'N' AND authentication_string REGEXP '^\*0$|^\*1$|^$';
DROP USER 前必须检查三处隐性依赖
删完就断服务?大概率是没查清这些:
- 查活跃连接:
SELECT ID, USER, HOST, COMMAND, TIME FROM information_schema.PROCESSLIST WHERE USER = 'xxx';,有结果就得先KILL掉 - 查代理关系:
SELECT * FROM mysql.proxies_priv WHERE CONCAT(User, '@', Host) = 'xxx@%';,如果其他账号靠它代理登录,删了就会连锁报错 - 查角色绑定:
SELECT FROM_USER, TO_USER, WITH_ADMIN_OPTION FROM mysql.role_edges WHERE FROM_USER = 'xxx';,MySQL 8.0+ 角色不会随用户自动清理,得先REVOKE
别漏掉空用户名和测试账号
安装后常残留匿名用户(''@'localhost')、测试用户('test'@'localhost'),它们是安全盲区:
- 查空用户要用
TRIM():SELECT Host, User, authentication_string FROM mysql.user WHERE TRIM(User) = '';,直接User = ''会漏掉含空格/制表符的记录 - 删时必须写全 host:
DROP USER ''@'localhost'; DROP USER 'test'@'localhost'; - 删完别忘了手动
DROP DATABASE IF EXISTS test;,DROP USER不会自动删库
复杂点在于:performance_schema.accounts 查不到从未登录过的账号,mysql.user 里又看不出是否真被引用——得结合配置文件 grep、ProxySQL 表、复制源配置一起交叉验证,否则删了才发现某台备份机还在用那个账号连。


















