账户管理
创建账户并授权
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';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
以上四组例子创建了四个账户,他们分别具有如下属性:
前两个帐户的用户名均为finley。两者都是具有执行任何操作的完整全局特权的超级用户帐户。仅当从本地主机连接时,才能使用'finley' @'localhost'帐户。'finley'@'%.example.com'帐户在主机部分使用%通配符,因此可用于从example.com域名下的任何主机进行连接。
如果有本地主机的匿名用户帐户,则必须使用'finley'@'localhost'帐户。如果没有'finley'@'localhost'帐户,则当finley从本地主机进行连接并且finley被视为匿名用户时,该匿名用户帐户将具有优先权。原因是匿名用户帐户的主机列值比'finley'@'%'帐户更具体,因此在用户表排序顺序中排在更早的位置。
'admin' @'localhost'帐户只能由admin用来从本地主机进行连接。它被授予全局RELOAD和PROCESS管理特权。这些特权使admin用户可以执行mysqladmin reload,mysqladmin refresh和mysqladmin flush-xxx命令以及mysqladmin processlist。不授予访问任何数据库的特权。您可以使用GRANT语句添加此类特权。
'dummy'@'localhost'帐户没有密码(不安全,不建议使用)。该帐户只能用于从本地主机连接。这条语句没有授予任何特权,您假定您将使用GRANT语句授予该帐户特定的特权。
以上的授权语句中的权限名可在之前的MYSQL特权找到。
前面的示例在全局级别授予特权。下一个示例创建三个帐户,并授予他们较低级别的访问权限;即针对特定数据库或数据库中的对象。每个帐户都有一个自定义用户名,但是主机名部分有所不同:
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';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这三个帐户适合在以下情况使用:
'custom'@'localhost'帐户具有访问bankaccount数据库的所有数据库级特权。该帐户只能用于从本地主机连接到服务器。
'custom'@'host47.example.com'帐户具有访问expenses数据库的特定数据库级别特权。该帐户只能用于从主机host47.example.com连接到服务器。
'custom'@'%.example.com'帐户具有特定的表级特权,可以从example.com域名下的任何主机访问客户数据库中的地址表。由于在帐户名称的主机部分中使用%通配符,因此该帐户可用于从此域名中的所有计算机连接到服务器。
检查帐户特权和属性
使用SHOW GRANTS查看帐户的特权:
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+----------------------------------------------------------------------------+
| Grants for admin@localhost |
+----------------------------------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+----------------------------------------------------------------------------+
1
2
3
4
5
6
使用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
1
2
3
4
5
6
7
8
9
10
启用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';
1
2
3
4
5
6
7
撤消数据库级特权:
REVOKE CREATE,DROP
ON expenses.*
FROM 'custom'@'host47.example.com';
1
2
3
撤消表级特权:
REVOKE INSERT,UPDATE,DELETE
ON customer.addresses
FROM 'custom'@'%.example.com';
1
2
3
要检查特权撤销的效果,请使用SHOW GRANTS: