要管理 MySQL 帐户,请使用为此目的而设计的 SQL 语句
CREATE USER
和DROP USER
创建和删除帐户。SHOW GRANTS
显示帐户权限分配。
帐户管理语句会导致服务器对底层授权表进行相应的修改,这些授权表将在 第 8.2.3 节,“授权表” 中介绍。
不建议直接使用 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
域中的任何主机连接。如果为
localhost
设置了匿名用户账户,则需要'finley'@'localhost'
账户。如果没有'finley'@'localhost'
账户,当finley
从本地主机连接时,匿名用户账户将优先,finley
将被视为匿名用户。原因是匿名用户账户的Host
列值比'finley'@'%'
账户更具体,因此在user
表排序中排在前面。(有关user
表排序的信息,请参阅 第 8.2.6 节,“访问控制,阶段 1:连接验证”。)'admin'@'localhost'
账户只能由admin
从本地主机连接使用。它被授予了全局RELOAD
和PROCESS
管理权限。这些权限允许admin
用户执行 mysqladmin reload、mysqladmin refresh 和 mysqladmin flush-xxx
命令,以及 mysqladmin processlist。没有授予访问任何数据库的权限。您可以使用GRANT
语句添加这些权限。'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';