MySQL user用户表详解(新手必看)
MySQL 服务器通过权限表来控制用户对数据库的访问。权限表被存放在系统库 mysql 中,MySQL 数据库系统会根据权限表的内容授予每个用户相应的权限。
MySQL 中非常重要的权限表有 user、db、tables_priv、columns_priv、procs_priv 等。
user 表用于记录用户账号和权限信息,它有 51 个字段。可以使用如下语句查看 user 表结构,其中包含字段信息(限于篇幅,此处仅展示部分数据):
MySQL 中用主机名、用户名组合标识一个完整的用户,形式为“用户名@主机名”。这 3 个字段的值就是创建用户时保存的用户信息。我们可以直接从数据库中查询字段信息,结果如下所示:
例如,前面使用的 root 用户对应的 Host、User 字段信息分别是“%”、“root”,而密码信息是加密后的数据,主要用来保证数据库的安全。在登录数据库的时候,需要三者完全匹配才可以成功登录。
从 user 表结构中可以看到,这些字段的值默认都是 N。如果要修改用户权限,则可以使用 GRANT 语句或 UPDATE 语句更改 user 表权限列中这些字段的值。
也可以使用如下 SQL 语句查询特定字段,其中的查询字段也可以换成其他字段:
1) Host 字段表示主机名。有如下几种取值:
2) User 字段表示用户名。同一用户通过不同方式连接获得的权限是不一样的。
3) authentication_string 字段表示密码。所有密码串都是通过明文字符串生成的密文字符串。MySQL 8.0 在用户管理方面增加了角色管理,对默认的密码加密方式也进行了调整,由 SHA1 改为 SHA2,SHA2 和 SHA1 一样是不可逆的。MySQL 8.0 在用户管理方面的功能和安全性都较以前的版本大大增强。在 MySQL 5.7 以前的版本中,密码被保存在 password 字段中;而在 MySQL 5.7 及以后的版本中,使用 authentication_string 字段代替了 password 字段。
4) Select_priv 字段表示用户是否拥有查询表中数据的权限。
MySQL 中非常重要的权限表有 user、db、tables_priv、columns_priv、procs_priv 等。
user 表用于记录用户账号和权限信息,它有 51 个字段。可以使用如下语句查看 user 表结构,其中包含字段信息(限于篇幅,此处仅展示部分数据):
mysql> DESC mysql.user; +--------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+---------+-------+ | Host | char(255) | NO | PRI | | | | User | char(32) | NO | PRI | | | | Select\_priv | enum('N','Y') | NO | | N | | | Insert\_priv | enum('N','Y') | NO | | N | | | Update\_priv | enum('N','Y') | NO | | N | | | Delete\_priv | enum('N','Y') | NO | | N | | | Create\_priv | enum('N','Y') | NO | | N | | | Drop\_priv | enum('N','Y') | NO | | N | | | Reload\_priv | enum('N','Y') | NO | | N | |这些字段可以分为 4 类,分别是用户列、权限列、安全列和资源控制列。
user表用户列
user 表中的用户列有 Host、User、authentication_string 3 个字段,分别表示主机名、用户名和密码。其中,Host 和 User 为 user 表的联合主键。MySQL 中用主机名、用户名组合标识一个完整的用户,形式为“用户名@主机名”。这 3 个字段的值就是创建用户时保存的用户信息。我们可以直接从数据库中查询字段信息,结果如下所示:
mysql> SELECT User, Host, authentication_string FROM user WHERE User='root' AND Host='%'; +------+------+--------------------------------------------+ | User | Host | authentication\_string | | root | % | *CB588AAE96BA3780D597CEF19CE7A29C9F4AF3D4 | +------+------+--------------------------------------------+ 1 row in set (0.00 sec)
例如,前面使用的 root 用户对应的 Host、User 字段信息分别是“%”、“root”,而密码信息是加密后的数据,主要用来保证数据库的安全。在登录数据库的时候,需要三者完全匹配才可以成功登录。
user表权限列
user 表权限列中的字段决定了用户权限,描述了在全局范围内允许用户对数据和数据库执行的操作,既包括查询权限、修改权限等普通权限,也包括关闭服务器、超级权限、加载用户等高级权限,普通权限用于操作数据库,高级权限用于管理数据库。这些字段的数据类型为枚举类型,取值只能是 Y 和 N,Y 表示该用户拥有对应的权限,N 表示该用户没有对应的权限。从 user 表结构中可以看到,这些字段的值默认都是 N。如果要修改用户权限,则可以使用 GRANT 语句或 UPDATE 语句更改 user 表权限列中这些字段的值。
user表安全列
user 表中的安全列有 6 个字段,其中:- 两个是与 SSL 相关的字段,用于加密;
- 两个是与 x509 相关的字段,用于标识用户;
- 两个是与授权插件相关的字段,用于验证用户身份,这两个字段不能为空,否则服务器会使用内建的授权验证机制来验证用户身份。
user表资源控制列
user 表中的资源控制列有 4 个字段,用来限制用户使用的资源:- max_questions 字段表示允许用户每小时执行的查询操作次数;
- max_updates 字段表示允许用户每小时执行的更新操作次数;
- max_connections 字段表示允许用户每小时执行的连接操作次数;
- max_user_connections 字段表示允许用户同时建立的连接数。
user表字段的含义
可以使用如下 SQL 语句查看当前数据库有哪些用户。如果需要以列的方式显示数据,则只需在 SQL 语句后面加上“\G”即可。SELECT * FROM mysql.user; SELECT * FROM mysql.user\G;
也可以使用如下 SQL 语句查询特定字段,其中的查询字段也可以换成其他字段:
mysql> SELECT Host, User, authentication_string, Select_priv FROM mysql.user\G; *************************** 1. row *************************** Host: % User: root authentication_string: *CB588AAE96BA3780D597CEF19CE7A29C9F4AF3D4 Select_priv: Y *************************** 2. row *************************** Host: localhost User: mysql.infoschema authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED Select_priv: Y *************************** 3. row *************************** Host: localhost User: mysql.session authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED Select_priv: N *************************** 4. row *************************** Host: localhost User: mysql.sys authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED Select_priv: N 4 rows in set (0.00 sec)可以看到,当前数据库有 4 个用户。上述查询结果中有 4 个字段,各字段的含义如下:
1) Host 字段表示主机名。有如下几种取值:
- %:表示所有远程机器都可以进行 TCP 方式的连接。
- IP 地址(如 192.168.1.2、127.0.0.1):表示通过指定 IP 地址进行 TCP 方式的连接。
- 机器名:表示通过指定网络中的机器名进行 TCP 方式的连接。
- localhost:表示允许自身机器通过命令行方式连接,例如,通过“mysql-u xxx-p xxx”方式连接。
2) User 字段表示用户名。同一用户通过不同方式连接获得的权限是不一样的。
3) authentication_string 字段表示密码。所有密码串都是通过明文字符串生成的密文字符串。MySQL 8.0 在用户管理方面增加了角色管理,对默认的密码加密方式也进行了调整,由 SHA1 改为 SHA2,SHA2 和 SHA1 一样是不可逆的。MySQL 8.0 在用户管理方面的功能和安全性都较以前的版本大大增强。在 MySQL 5.7 以前的版本中,密码被保存在 password 字段中;而在 MySQL 5.7 及以后的版本中,使用 authentication_string 字段代替了 password 字段。
4) Select_priv 字段表示用户是否拥有查询表中数据的权限。