MySQL 8.0.19+ 真正支持账号级自动锁定,但必须同时满足三个硬性条件:认证插件为 caching_sha2_password 或 mysql_native_password、FAILED_LOGIN_ATTEMPTS 与 PASSWORD_LOCK_TIME 成对出现在同一条 CREATE/ALTER USER 语句中、validate_password 插件已启用;缺一则 account_locked 永远为 'N'。

MySQL 8.0.19+ 才真正支持账号级自动锁定,且必须同时满足三个硬性条件:用户认证插件是 caching_sha2_password 或 mysql_native_password、FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 成对出现在同一条语句中、validate_password 插件已启用。缺一不可,否则查 account_locked 永远是 'N'。
为什么单独执行 ALTER USER FAILED_LOGIN_ATTEMPTS 3 没反应
这条命令会被 MySQL 静默忽略——它不是独立开关,而是策略绑定参数的一部分。
-
FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME必须同时出现在同一条CREATE USER或ALTER USER语句中,顺序无关,但少一个就完全失效 - 已有用户不能只加策略:必须连认证插件一起重置,例如:
ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'pwd' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1; - 如果当前插件是
auth_socket或sha256_password,哪怕语法写对,account_locked字段也始终为'N'
validate_password 插件为什么是强制依赖
它不是可选增强项,而是失败计数机制的底层支撑。没它,输错密码根本不会累加计数,日志里也不会出现 Too many failed login attempts 记录。
- 检查是否启用:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,结果必须是ACTIVE - 启用方式二选一:配置文件加
plugin_load_add = validate_password.so后重启;或运行INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 注意:启用后会强制触发密码强度校验(如
validate_password.length),可能让旧脚本建用户失败
怎样确认账号真的被锁了,而不是单纯密码错
输错密码和账号被锁都报 ERROR 1045 (28000),仅看错误提示无法区分。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 查系统表:
SELECT user, host, account_locked, failed_login_attempts FROM mysql.user WHERE user = 'u'; - 如果
account_locked = 'Y',说明已触发真锁定 - 如果
failed_login_attempts > 0但account_locked = 'N',说明还在累积失败次数,未达阈值 - 解锁只能由管理员执行:
ALTER USER 'u'@'%' ACCOUNT UNLOCK;
connection_control 插件能防暴力破解吗
不能实现账号级锁定。它只是让第 N 次失败后的响应变慢,不修改 account_locked 字段,也不拦截连接请求。
- 必须同时加载两个插件:
connection_control.so和connection_control_failed_login_attempts.so,缺一不可 -
connection_control_failed_connections_threshold = 3只表示“从第 4 次开始计延迟”,但若connection_control_min_connection_delay = 0(默认值),延迟就是 0 毫秒 → 完全无感 - 单位是毫秒,不是秒:
60000是 1 分钟,60是 60 毫秒,基本察觉不到 - 它对 socket 连接、用户不存在、SSL 错误、网络超时等都不生效,只统计标准认证失败
真正的难点不在语法,而在于认证插件绑定、策略显式声明、插件启用三者缺一不可。生产环境建议用 fail2ban 监控 MySQL 错误日志,匹配 Access denied for user 后封 IP,这是目前最可控、最通用的做法。










