MySQL 8.0账户锁定需同时满足三条件才生效:认证插件为caching_sha2_password或mysql_native_password、FAILED_LOGIN_ATTEMPTS与PASSWORD_LOCK_TIME成对设置、validate_password插件已启用;缺一则account_locked恒为N。

MySQL 8.0 的账户锁定机制不会自动生效,必须同时满足三个硬性条件:用户认证插件是 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 0.04167;(锁 1 小时) - 若用户当前插件是
auth_socket或sha256_password,即使语法写对,account_locked字段也始终为N
如何确认 validate_password 已真正启用?
该插件(或组件)不是可选增强项,而是失败计数机制的底层依赖。没它,输错密码根本不会累加计数,日志里也不会出现 Too many failed login attempts 记录。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 检查状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,结果必须是ACTIVE - MySQL 8.0.17+ 推荐用组件方式安装:
INSTALL COMPONENT 'file://component_validate_password';,并确保my.cnf中有plugin-load-add = validate_password.so - 启用后会强制触发密码强度校验(如
validate_password.length),可能让旧脚本建用户失败
为什么 max_connect_errors 不是防暴力破解的正确参数?
它统计的是「TCP 连接成功但认证数据没发完就断开」的次数,和密码输错无关。攻击者用标准 MySQL client 正常重试,这个值根本不会增加。
- 设成 1 并不能防爆破,反而容易因网络抖动误伤正常连接
- 一旦触发,MySQL 会把整个 IP 加入
host_cache并拒绝所有后续连接(包括密码正确的),恢复只能靠FLUSH HOSTS或重启 - 真正有效的前置防护是系统级:比如
fail2ban监控 error log 中的Access denied for user,匹配 5 次就封 IP 1 小时
验证锁定是否真生效,别只看 account_locked 字段
SELECT user, host, account_locked FROM mysql.user 中该字段仍为 N 是正常现象,不代表没生效——验证必须用新连接实测。
- 锁定状态一旦触发,就严格按
PASSWORD_LOCK_TIME(单位是天)倒计时;写0表示永久锁定,只能由管理员ALTER USER ... ACCOUNT UNLOCK解 -
ACCOUNT LOCK是手动禁用,和自动锁定机制完全无关;若两者共存,MySQL 优先执行硬锁,失败计数器压根不启动 - 失败计数是“连续失败”:中间有一次成功登录,计数器就清零;但锁定状态不会因此自动解除

















