mysql账号被锁时连不上,必须用高权限账号执行alter user 'xxx'@'localhost' identified by 'newpass' account unlock,同步解除account_locked='y'和password_expired='y'状态,并确认authentication plugin兼容性;仅输对密码或flush privileges无效。

MySQL账号被锁时连不上,ERROR 1045或“Account is locked”怎么办
不是密码错了,也不是服务没起来——是account_locked字段值为'Y',MySQL在认证流程最前端就直接拒绝登录。哪怕输对密码,也会卡在Access denied for user 'xxx'@'localhost'. Account is locked.。常见诱因包括:连续输错密码超限、手动执行ALTER USER ... ACCOUNT LOCK、或用不兼容客户端连8.0+服务触发隐式锁定。
必须用root执行ALTER USER解锁,不能只写ACCOUNT UNLOCK
普通用户无法自救,必须用高权限账号(如root)登录后操作。关键点在于:ACCOUNT UNLOCK本身不重置密码状态,若同时存在password_expired = 'Y',解锁后首次登录仍会强制改密——而你根本连不进去。
- 先确认状态:
SELECT user, host, account_locked, password_expired FROM mysql.user WHERE user = 'xxx'; - 若两个字段都是
'Y',必须一步到位:ALTER USER 'xxx'@'localhost' IDENTIFIED BY 'newpass' ACCOUNT UNLOCK; - 主机名必须严格匹配:
'xxx'@'localhost'不能写成'xxx'@'%',否则报ERROR 1396 (HY000) -
FLUSH PRIVILEGES对解锁完全无效——它只重载权限缓存,不改变account_locked运行时状态
MySQL 8.0 root被锁且无法用root登录?用--init-file临时启动
如果连root都被锁死,常规登录失败,又不想冒险用--skip-grant-tables(该模式下ALTER USER会被禁用),推荐用--init-file方式:
- 停服务:
sudo systemctl stop mysql - 准备SQL文件(如
/tmp/unlock-root.sql),内容仅一行:ALTER USER 'root'@'localhost' ACCOUNT UNLOCK; - 临时启动:
sudo mysqld --user=mysql --init-file=/tmp/unlock-root.sql & - 验证登录成功后,杀掉该进程:
sudo kill $(pgrep mysqld),再正常启动:sudo systemctl start mysql
注意:此法绕过权限校验只执行初始化SQL,比--skip-grant-tables更安全可控。
解锁后连不上?检查authentication plugin是否兼容
MySQL 8.0默认用caching_sha2_password插件,但很多老工具(Navicat旧版、PHP 7.4 mysqli、某些shell脚本)不支持它。即使账号已解锁,也会报Access denied却不提示锁定。
- 进库后立刻查:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; - 若需兼容,切回传统插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass'; - 别漏掉
'root'@'%'(如果存在),否则远程连接照样失败 - 改完plugin必须重新连接测试——这是最容易忽略的环节
真正麻烦的从来不是“怎么解锁”,而是解锁之后发现连不上,回头才发现插件不匹配、host写错、或只修了localhost却忘了%。











