立即终止账号所有活跃连接并禁用其认证能力:先用KILL命令强制结束当前会话,再通过ALTER USER ACCOUNT LOCK(≥8.0.14)或改空密码+REVOKE权限(

立刻失效该账号的当前所有连接,不是删用户、也不是改密码——那是后续动作,紧急时刻必须先斩断活跃会话。
用 KILL 命令强制终止该账号所有活跃连接
MySQL 不提供“一键踢掉某用户所有连接”的原生命令,但可通过 SHOW PROCESSLIST + KILL 组合实现。注意:必须用有 SUPER 或 CONNECTION_ADMIN 权限的账号执行(如 root@localhost)。
- 先查出该账号所有连接 ID:
SELECT id, user, host, db, command, time, state, info FROM information_schema.processlist WHERE user = 'leaked_user' AND host LIKE '192.168.5.%';
- 逐个 KILL(生产环境慎用
KILL QUERY,优先用KILL全杀):KILL 12345;
- 批量生成 KILL 语句(更安全高效):
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'leaked_user';复制结果,粘贴执行
立即禁用该账号认证能力,防止新连接建立
仅杀连接不够——只要账号密码没变,攻击者仍可重连。必须立刻切断认证路径:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 如果 MySQL ≥ 8.0.14,直接禁用登录:
ALTER USER 'leaked_user'@'%' ACCOUNT LOCK;
- 如果 MySQL ALTER USER 'leaked_user'@'%' IDENTIFIED WITH mysql_native_password BY '';
REVOKE ALL PRIVILEGES ON *.* FROM 'leaked_user'@'%';
FLUSH PRIVILEGES;
- 注意:
ACCOUNT LOCK是最干净的方案,但部分旧客户端(如某些 JDBC 驱动)可能忽略该状态,所以建议配合REVOKE+FLUSH PRIVILEGES双保险
检查是否已存在长期空闲但未断开的连接
MySQL 的 wait_timeout 默认是 28800 秒(8 小时),攻击者可能维持一个 idle 连接数小时不发请求,PROCESSLIST 里显示 Sleep 状态但依然有效。这类连接不会被自动清理,必须手动 KILL。
- 加条件过滤空闲连接:
SELECT id, user, host, time, state FROM information_schema.processlist WHERE user = 'leaked_user' AND time > 60;
(time > 60表示空闲超 1 分钟) - 不要依赖
max_connections或连接池自动回收——那是防御手段,不是应急响应
真正容易被忽略的是:KILL 后未刷新权限,或误以为 ACCOUNT LOCK 能阻断所有协议层重连(比如有些代理或连接池会缓存认证态)。必须验证——用该账号尝试新建连接,确认返回 ERROR 3118 (HY000): Access denied for user ... Account is locked 或认证失败。吊销不是“做了就完”,而是“做到连接层面彻底不可达”。










