如何在 MySQL 中锁定用户帐户

本文介绍了在 MySQL 中如何锁定一个用户帐户。

某些特定的场景下,您可能想要锁定一个用户账户,比如:

  • 创建一个锁定的用户,等授权完成后再解锁
  • 此用户账户已经不被使用
  • 此用户账户已经被泄露
  • 此用户只是临时使用,使用完成后将用户锁定

要锁定一个已经存在的用户,请使用 ALTER USER .. ACCOUNT LOCK 语句。

要直接创建一个锁定的用户,请使用 CREATE USER .. ACCOUNT LOCK 语句。

查询用户的锁定状态

您可以在 mysql 数据库中的 user 表中查看用户的锁定状态。mysql.user 表中的 account_locked 列中保存了帐户是否被锁定的状态: Y 指示了此用户被锁定, N 指示了此用户未锁定。

请使用以下 SQL 语句查询 MySQL 数据库服务器中的所有用户的锁定状态:

SELECT user, host, account_locked
FROM mysql.user;
+------------------+-----------+----------------+
| user             | host      | account_locked |
+------------------+-----------+----------------+
| root             | %         | N              |
| sqliz            | %         | N              |
| test_role1       | %         | Y              |
| test_role2       | %         | Y              |
| test_user1_new   | %         | N              |
| test_user2_new   | %         | N              |
| test_user3_new   | %         | N              |
| testuser         | %         | N              |
| mysql.infoschema | localhost | Y              |
| mysql.session    | localhost | Y              |
| mysql.sys        | localhost | Y              |
| root             | localhost | N              |
+------------------+-----------+----------------+

锁定一个现有的用户

要锁定一个现有的用户,你应该使用 ALTER USER .. ACCOUNT LOCK 语句。

下面的 SQL 语句将锁定用户账户 'sqliz'@'%'。请先参考 MySQL 创建用户教程创建用户 'sqliz'@'%'

请使用 root 账户或者其他管理员账户执行下面的语句:

ALTER USER 'sqliz'@'%' ACCOUNT LOCK;

要查询 用户账户 'sqliz'@'%' 的锁定状态,请运行以下 SQL 语句:

SELECT user, host, account_locked
FROM mysql.user
WHERE user = 'sqliz' AND host = '%';
+-------+------+----------------+
| user  | host | account_locked |
+-------+------+----------------+
| sqliz | %    | Y              |
+-------+------+----------------+

这里, account_locked 列中的 Y 表明用户账户 'sqliz'@'%' 已经被锁定。

在 mysql client 中尝试使用 sqliz 登录,已验证用户是否真正的被锁定。

mysql -u sqliz -p

输入密码 sqliz 并按下 Enter

Enter password: ********

由于用户已经被锁定,MySQL 服务器将会给出错误提示: “ERROR 3118 (HY000): Access denied for user ‘sqliz’@‘192.168.0.204’. Account is locked.”

创建一个锁定的用户

要直接创建一个锁定的用户,请使用 CREATE USER .. ACCOUNT LOCK 语句。

假设,要创建新用户 sqliz2, 请执行下面的语句:

CREATE user 'sqliz2'@'%'
IDENTIFIED by 'SqLiZ9879123!'
ACCOUNT LOCK;

这里创建了一个用户名为 sqliz2 且允许在任何主机连接的用户,并且此用户是锁定的。

要查询 用户账户 'sqliz2'@'%' 的锁定状态,请运行以下 SQL 语句:

SELECT user, host, account_locked
FROM mysql.user
WHERE user = 'sqliz2' AND host = '%';
+--------+------+----------------+
| user   | host | account_locked |
+--------+------+----------------+
| sqliz2 | %    | Y              |
+--------+------+----------------+

锁定用户的连接次数

MySQL 维护了一个变量 Locked_connects,它用来保存锁定的用户尝试连接到服务器的次数。当锁定的帐户尝试登录时,Locked_connects 变量的值将加 1。

您可以使用下面的语句查看当前 MySQL 数据库服务器上锁定用户尝试登录的次数:

SHOW GLOBAL STATUS LIKE 'Locked_connects';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| Locked_connects | 3     |
+-----------------+-------+

注意,您的结果可能会有所不同。

结论

在 MySQL 中您可以通过以下两种方法锁定用户:

  • 要锁定一个已经存在的用户,请使用 ALTER USER .. ACCOUNT LOCK 语句。
  • 要直接创建一个锁定的用户,请使用 CREATE USER .. ACCOUNT LOCK 语句。

对于一个锁定的用户,您可以通过解锁用户来让他恢复正常的使用。