MySQL 8.0+ 中 ACCOUNT LOCK 可立即持久锁定账号,仅阻断新连接;FAILED_LOGIN_ATTEMPTS 需启用 validate_password 插件才生效,二者共存时 ACCOUNT LOCK 优先级更高,且均需精确匹配 host 并注意认证插件兼容性。

MySQL 8.0+ 如何用 ACCOUNT LOCK 手动锁定账号
直接执行 ALTER USER 'username'@'host' ACCOUNT LOCK; 就能立刻禁止登录,不管密码是否正确。这个锁是持久的,重启 MySQL 不会自动解除,也不会影响已存在的连接(只拦新连接)。
常见错误现象:执行后仍能登录——大概率是没刷新权限缓存,或者用户 host 匹配不精确(比如用了 'user'@'%' 锁定,但实际连接用的是 'user'@'192.168.1.100')。
- 务必确认
host部分完全一致,可用SELECT User, Host FROM mysql.user;核对 - 执行后建议运行
FLUSH PRIVILEGES;(虽然多数情况下非必需,但能避免缓存导致的延迟生效) - 解锁用
ALTER USER 'username'@'host' ACCOUNT UNLOCK;
为什么 FAILED_LOGIN_ATTEMPTS 策略在 MySQL 中默认不生效
MySQL 8.0 引入了基于密码验证插件的失败次数锁定机制,但它不是开箱即用的——必须显式启用 validate_password 插件,并配置策略参数,否则 FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 这两个选项会被忽略。
使用场景:你希望某个账号输错 3 次密码就自动锁定 1 小时,而不是手动干预。
- 先检查插件是否加载:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password'; - 若未启用,需在配置文件中加
plugin_load_add = validate_password.so并重启,或运行INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 然后才能为用户设置:
ALTER USER 'attacker'@'%' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 60; - 注意:该策略仅对使用
mysql_native_password或caching_sha2_password认证的用户有效;若用户用auth_socket等插件,此策略完全不触发
ACCOUNT LOCK 和失败次数策略混用时的真实行为
两者可以共存,但优先级不同:只要账号被 ACCOUNT LOCK 显式锁定,无论失败次数是否达标、密码是否正确,一律拒绝登录;而失败次数策略触发的锁定,本质是自动给用户加上 ACCOUNT LOCK 状态(可通过 SELECT account_locked FROM mysql.user WHERE User='xxx'; 查看)。
容易踩的坑:误以为“设了失败次数就万事大吉”,结果发现攻击者换 IP 或绕过认证插件(比如用 root 的 socket 登录再提权),导致策略形同虚设。
- 失败次数策略只防密码爆破,不防 SQL 注入后的权限滥用
-
ACCOUNT LOCK是最直接的应急手段,适合已确认恶意行为后快速止损 - 锁定期间用户仍可能通过已建立的连接执行操作,如需彻底中断,得配合
KILL CONNECTION查杀活跃会话
从日志里定位恶意登录尝试并联动处理
MySQL 默认不记录登录失败详情,必须开启 log_error_verbosity = 3(5.7.2+ / 8.0.13+),并在错误日志中搜索 Access denied for user 行,才能看到具体用户名和来源 IP。
性能影响小,但日志体积会上升;建议搭配定期清理或外部日志聚合工具使用。
- 确认当前设置:
SELECT @@log_error_verbosity;,值为 1/2/3,3 才含失败登录上下文 - 典型失败日志行:
[Warning] [MY-010055] [Server] Access denied for user 'admin'@'10.0.2.100' (using password: YES) - 拿到 IP 后可进一步在防火墙层封禁,或写脚本自动匹配高频失败 IP 并执行
ALTER USER …… ACCOUNT LOCK; - 注意:错误日志路径由
log_error变量指定,不是所有部署都默认开启






























