mysql 5.7.6+ 支持 account lock/unlock,低版本执行报 error 1064;需先查 select version() 确认版本,且不可锁定当前用户或 root;锁定后登录失败报 error 3118,状态查 mysql.user.account_locked 字段(y/n)。

MySQL 5.7.6+ 才支持 ACCOUNT LOCK 和 ACCOUNT UNLOCK,低版本直接执行会报错 ERROR 1064。
确认 MySQL 版本是否支持 ACCOUNT LOCK
不查版本就执行锁定语句,大概率遇到语法错误。先运行:
SELECT VERSION();
只有返回值类似 5.7.6、8.0.12 或更高,才能用 ACCOUNT LOCK。5.7.5 及更早版本不识别该语法,替代方案只能是 DROP USER 或 REVOKE ALL PRIVILEGES + 修改 mysql.user 表的 account_locked 字段(8.0+ 才有该字段)。
锁定用户账户:使用 ACCOUNT LOCK
锁定后,该用户仍能登录(如果密码正确),但所有 SQL 操作都会立即失败,提示 ERROR 3118 (HY000): Access denied for user 'xxx'@'%' (using password: YES). Account is locked.
-
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'pwd123' ACCOUNT LOCK;—— 创建即锁定 -
ALTER USER 'dev'@'localhost' ACCOUNT LOCK;—— 对已有用户加锁 - 不能对
root或当前会话用户执行ACCOUNT LOCK,否则报错ERROR 3119 (HY000): Cannot lock the current user. - 锁定不影响用户在
mysql.user表中的其他权限配置,只控制登录后的操作放行与否
解锁用户账户:使用 ACCOUNT UNLOCK
解锁只是移除账户锁定状态,不恢复密码、不重置权限、不修改 host 限制。
-
ALTER USER 'dev'@'localhost' ACCOUNT UNLOCK;—— 这是最常用方式 -
CREATE USER语句中不能用ACCOUNT UNLOCK,它只用于ALTER USER - 如果误用
UNLOCK TABLES(这是另一个完全无关的语句),不会报错但也不起作用 - 解锁后用户需用原密码重新连接,连接成功即代表解锁生效
验证账户锁定状态
别只靠“执行没报错”判断是否生效。查 mysql.user 表最可靠:
SELECT user, host, account_locked FROM mysql.user WHERE user = 'dev';
结果中 account_locked 为 Y 表示已锁,N 表示已解锁。注意:account_locked 字段仅在 MySQL 5.7.6+ 和 8.0+ 中存在,5.7.5- 查询会提示 Unknown column 'account_locked'。
实际运维中,最容易被忽略的是版本兼容性检查和当前会话用户的限制——想锁自己?MySQL 直接拒绝,连试都不让试。











