要管理 MySQL 账户,请使用专门的 SQL 语句:
-
CREATE USER
和DROP USER
创建和删除账户。 -
SHOW GRANTS
显示账户权限分配。
账户管理语句会导致服务器对基础授权表进行相应的修改,这些表在 第 8.2.3 节“Grant Tables” 中讨论。
使用语句如 INSERT
、UPDATE
或 DELETE
直接修改授权表是不被推荐的,并且可能会导致服务器忽略由于这种修改而变得畸形的行。
对于任何修改授权表的操作,服务器都会检查表是否具有预期的结构,并在不符合时产生错误。要更新表以达到预期的结构,请执行 MySQL 升级过程。见 第 3 章升级 MySQL。
创建账户的另一个选项是使用 GUI 工具 MySQL Workbench。此外,一些第三方程序还提供了 MySQL 账户管理功能。phpMyAdmin
就是一个这样的程序。
本节讨论以下主题:
有关这些语句的更多信息,请参见 第 15.7.1 节“账户管理语句”。
以下示例显示如何使用 mysql 客户端程序来设置新账户。这些示例假设 MySQL root
账户具有 CREATE USER
权限和授予其他账户的所有权限。
在命令行中,以 MySQL root
用户身份连接到服务器,输入适当的密码:
$> 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
域中的任何主机连接。需要
'finley'@'localhost'
账户,因为如果存在匿名用户账户 дляlocalhost
,那么在finley
从本地主机连接时,finley
将被视为匿名用户。原因是匿名用户账户在user
表中的Host
列值比'finley'@'%'
账户更具体,因此在user
表排序中排在前面。(有关user
表排序的信息,请参见 第 8.2.6 节“访问控制、阶段 1:连接验证”。) -
管理员
'admin'@'localhost'
帐户只能由管理员从本地主机连接使用。它被授予了全局RELOAD
和PROCESS
管理权限。这些权限使管理员用户能够执行 mysqladmin reload, mysqladmin refresh, 和 mysqladmin flush-xxx
命令,以及 mysqladmin processlist 。没有授予访问任何数据库的权限。你可以使用GRANT
语句添加这样的权限。 -
dummy
'dummy'@'localhost'
帐户没有密码(这是不安全的,不建议使用)。该帐户只能从本地主机连接使用。没有授予任何权限。假设你使用GRANT
语句授予该帐户特定的权限。
前面的示例授予了全局级别的权限。下一个示例创建了三个帐户,并授予了它们在较低级别的访问权限;即,到特定的数据库或数据库中的对象。每个帐户的用户名都是 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'
帐户拥有访问customer
数据库中的addresses
表的特定表级别权限,从example.com
域中的所有机器连接到服务器,因为在帐户名称的主机部分使用了%
通配符。
要查看帐户的权限,使用 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
系统变量会使 SHOW CREATE USER
以十六进制字符串形式显示包含不可打印字符的哈希值,而不是作为常规字符串文字。
要撤销帐户权限,使用 REVOKE
语句。权限可以在不同的级别撤销,就像它们可以在不同的级别授予一样。
撤销全局权限:
REVOKE ALL
ON *.*
FROM 'finley'@'%.example.com';
REVOKE RELOAD
ON *.*
FROM 'admin'@'localhost';
撤销数据库级别权限:
REVOKE CREATE,DROP
ON expenses.*
FROM 'custom'@'host47.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';