版本8.0 

MySQL 8.0参考手册  /  ...  /  添加用户帐户


6.3.2添加用户帐户

 

要创建MySQL帐户,请使用用于创建帐户和建立其权限的帐户管理语句,例如CREATE USER和 GRANT。这些语句使服务器对基础授权表进行适当的修改。所有这些陈述在 第13.7.1节“帐户管理声明”中描述。

注意

使用诸如,或者 不鼓励的语句直接修改授权表 INSERT, 并且风险自负。服务器可以自由忽略由于此类修改而变得格式错误的行。 UPDATEDELETE

对于修改授权表的任何操作,服务器检查表是否具有预期结构,否则生成错误。必须运行mysql_upgrade才能将表更新为预期的结构。

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

以下示例显示如何使用 mysql客户端程序设置新帐户。这些示例假定已根据第2.9.4节“保护初始MySQL帐户”中所述的缺省值设置了特权。这意味着要进行更改,您必须以root拥有该CREATE USER权限的MySQL 用户 身份连接到MySQL服务器。

首先,使用mysql程序以MySQL root用户身份连接到服务器:

shell> mysql --user=root mysql

如果您已为root 帐户指定了密码,则还必须提供--password或 -p选项。

连接到服务器后root,您可以添加新帐户。以下示例使用 CREATE USER 和 GRANT语句设置四个帐户:

mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'
 ->     WITH GRANT OPTION;
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'
 ->     WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> CREATE USER 'dummy'@'localhost';

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

  • 两个帐户的用户名为finley。两者都是具有完全权限的超级用户帐户。'finley'@'localhost'只有从本地主机连接时才能使用该帐户。该 'finley'@'%'帐户使用 '%'通配符作为主机部分,因此可用于从任何主机进行连接。
    'finley'@'localhost'如果有匿名用户帐户,则 该帐户是必需的 localhost。如果没有该 'finley'@'localhost'帐户,finley则从本地主机连接时该匿名用户帐户优先 , finley并被视为匿名用户。原因是匿名用户帐户具有Host比'finley'@'%'帐户更具体的列值 ,因此在user表格排序顺序中更早出现。(user表格排序将在 第6.2.6节“访问控制,第1阶段:连接验证”中讨论。)
  • 该'admin'@'localhost'帐户只能用于admin从本地主机进行连接。它被授予RELOAD 和PROCESS管理权限。这些特权使 admin用户能够执行 mysqladmin reload,mysqladmin refresh和mysqladmin flush-xxx命令,以及mysqladmin processlist。没有授予访问任何数据库的权限。您可以使用GRANT 语句添加此类权限。
  • 该'dummy'@'localhost'帐户没有密码(这是不安全的,不推荐)。此帐户只能用于从本地主机进行连接。没有授予任何特权。假设您将使用GRANT语句向帐户授予特定权限 。

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

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

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

mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row *************************** CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*67ACDEBDAB923990001F0FFB017EB8ED41861105' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

下一个示例创建三个帐户并授予他们访问特定数据库的权限。他们每个人的用户名 custom和密码为 password

mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON bankaccount.*
 ->     TO 'custom'@'localhost';
mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON expenses.*
 ->     TO 'custom'@'host47.example.com';
mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
 ->     ON customer.*
 ->     TO 'custom'@'%.example.com';

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

  • 第一个帐户可以访问bankaccount数据库,但只能访问 本地主机。
  • 第二个帐户可以访问expenses 数据库,但只能访问主机 host47.example.com
  • 第三个帐户可以customer 从example.com 域中的任何主机访问数据库。由于%在帐户名称的主机部分中使用通配符,因此该帐户可以访问域中的所有计算机。