文章目录

  • 添加帐户、分配权限、删除帐户
  • 创建帐户和授予权限
  • 检查帐户权限和属性
  • 撤销账户权限
  • 删除帐户


添加帐户、分配权限、删除帐户

要管理 MySQL 帐户,请使用用于该目的的 SQL 语句:

  • CREATE USERDROP USER 创建和删除帐户。
  • GRANTREVOKE 为帐户分配权限和撤销权限。
  • SHOW GRANTS 显示帐户权限分配。

创建帐户的另一个选择是使用GUI工具MySQL Workbench。此外,还有一些第三方程序提供MySQL帐户管理功能。phpMyAdmin就是这样一个程序。

创建帐户和授予权限

以下示例显示如何使用 mysql 客户端程序设置新帐户。这些示例假设MySQLroot帐户拥有CREATE USER权限以及它授予其他帐户的所有权限。

在命令行中,以 MySQL root 用户身份连接到服务器,在密码提示下输入正确密码:

shell> mysql -u root -p
Enter password: (enter root password here)

连接成功以后可以新增一个账户。

以下示例使用 CREATE USER 和 GRANT 语句来设置四个帐户(在您看到“password”的地方,替换一个适当的密码):

CREATE USER 'finley'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'localhost'
  WITH GRANT OPTION;

CREATE USER 'finley'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'%.example.com'
  WITH GRANT OPTION;

CREATE USER 'admin'@'localhost'
  IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
  ON *.*
  TO 'admin'@'localhost';

CREATE USER 'dummy'@'localhost';

由这些语句创建的帐户具有以下属性:

  • 两个账户的用户名都是finley。两个账户都是具有全局权限的超级用户。 只有当本地主机连接的时候'finley'@'localhost'账户才会被使用。 'finley'@'%.example.com' 账户的主机部分使用了'%'通配符,因此它可用于从 example.com 域中的任何主机进行连接。
    如果localhost有一个匿名用户帐户,那么'finley'@'localhost'帐户是必要的。如果没有'finley'@'localhost'帐户,那么当finley从本地主机连接并且finley被视为匿名用户时,匿名用户帐户将优先使用。这样做的原因是,匿名用户帐户的Host列值比'finley'@'%'帐户更具体,因此在用户表排序顺序中出现得更早。
  • 只用在本地通过admin连接的时候,'admin'@'localhost'账户才会被使用。它被授予全局 RELOADPROCESS 管理权限。这些权限使 admin 用户能够执行 mysqladmin reload、mysqladmin refreshmysqladmin flush-xxx 命令,以及 mysqladmin processlist。没有授予访问任何数据库的权限。您可以使用 GRANT 语句添加此类权限。
  • 'dummy'@'localhost'帐户没有密码(不安全,不建议使用)。该帐户只能用于从本地主机连接。不授予任何特权。

前面的示例在全局级别授予特权。下一个示例创建三个帐户,并授予它们较低级别的访问权限;也就是说,指向特定的数据库或数据库中的对象。每个帐户都有一个custom用户名,但主机名部分不同:

CREATE USER 'custom'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON bankaccount.*
  TO 'custom'@'localhost';

CREATE USER 'custom'@'host47.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON expenses.*
  TO 'custom'@'host47.example.com';

CREATE USER 'custom'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON customer.addresses
  TO 'custom'@'%.example.com';

这三个账户可以如下使用:

  • 'custom'@'localhost' 帐户拥有访问 bankaccount 数据库的所有数据库级权限。该帐户只能用于从本地主机连接到服务器。
  • 'custom'@'host47.example.com' 帐户具有访问expenses数据库的特定数据库级权限。该帐户只能用于从主机 host47.example.com 连接到服务器。
  • 'custom'@'%.example.com' 帐户具有特定的表级权限,可以从 example.com 域中的任何主机访问customer数据库中的addresses表。

检查帐户权限和属性

要查看帐户的权限,请使用 SHOW GRANTS

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+

要查看帐户的非权限属性,请使用 SHOW CREATE USER

mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT

启用print_identified_with_as_hex系统变量(从MySQL 8.0.17开始提供)会导致SHOW CREATE USER将包含不可打印字符的哈希值显示为十六进制字符串,而不是常规字符串文本。

撤销账户权限

要撤销帐户权限,请使用 REVOKE 语句。可以在不同级别撤销权限,就像可以在不同级别授予权限一样。

撤销全局权限:

REVOKE ALL
  ON *.*
  FROM 'finley'@'%.example.com';

REVOKE RELOAD
  ON *.*
  FROM 'admin'@'localhost';

撤销数据库级权限:

REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';

撤销表级权限:

REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';

要检查权限撤销的效果,请使用 SHOW GRANTS

mysql> SHOW GRANTS FOR 'admin'@'localhost';+---------------------------------------------+| Grants for admin@localhost                  |+---------------------------------------------+| GRANT PROCESS ON *.* TO 'admin'@'localhost' |+---------------------------------------------+

删除帐户

要删除帐户,请使用 DROP USER 语句。例如,删除之前创建的一些帐户:

DROP USER 'finley'@'localhost';DROP USER 'finley'@'%.example.com';DROP USER 'admin'@'localhost';DROP USER 'dummy'@'localhost';