1. 确认版本
执行 SELECT VERSION();,必须为 MySQL 8.0.19 或更高版本。低于此版本(如 8.0.17)不支持该语法。
2. 设置防暴力破解策略
sql
ALTER USER '用户名'@'%'
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1;
-
FAILED_LOGIN_ATTEMPTS:连续密码错误次数上限(0-32767,0 为关闭) -
PASSWORD_LOCK_TIME:锁定天数(0-32767,或UNBOUNDED表示永久锁定直到手动解锁)
3. 手动解锁(测试或紧急恢复用)
sql
ALTER USER '用户名'@'%' ACCOUNT UNLOCK;
执行后失败计数重置,账户恢复可登录状态。
4. 验证锁定状态
sql
SELECT user, host, account_locked FROM mysql.user WHERE user = '用户名';
account_locked 为 Y 表示已锁定,N 表示正常。
注意事项
版本硬门槛 :FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 在 MySQL 8.0.19 才引入,低版本执行直接报 1064 语法错误。你当前的 8.0.17 不支持。
两个参数必须同时非零:只设其中一个,锁定策略不会生效。
锁定后正确密码也无法登录 :一旦触发锁定,即使输入正确密码也会被拒绝,必须等待锁定时间到期或手动执行 ACCOUNT UNLOCK。
全局重置方式 :重启 MySQL 服务或执行 FLUSH PRIVILEGES 会解锁所有临时锁定账户并重置失败计数。
ACCOUNT UNLOCK 与 UNLOCK 的区别 :ALTER USER ... ACCOUNT UNLOCK 是解除"因失败次数超限导致的临时锁定";而 ALTER USER ... ACCOUNT LOCK/UNLOCK(不带 FAILED_LOGIN_ATTEMPTS)是管理员手动启用/禁用账户,两者场景不同。
低版本替代方案 :若无法升级到 8.0.19+,可在应用层实现登录失败限制(如网关限流、验证码),或安装 CONNECTION_CONTROL 插件(它提供的是递增延迟而非锁定,效果不同)。