MySQL默认数据库之mysql库
MySQL 访问权限系统表包含如下几张表:
-
user:包含用户帐户和全局权限和其他非权限列表(安全配置选项和资源控制选项列)
-
db:数据库级别的权限表
-
tables_priv:表级别的权限表
-
columns_priv:列级权限表
-
procs_priv:存储过程和函数权限表
-
proxies_priv:代理用户权限表
PS:
-
要更改权限表的内容,推荐使用帐号管理语句(如:CREATE USER、GRANT、REVOKE等)来间接修改,不建议直接使用DML语句修改权限表,否则后果自负
-
以下内容主要针对MySQL 5.7版本进行整理
1、user
该表提供查询全局权限信息,该表中的帐号密码信息在认证1阶段(关于认证阶段相关的内容我们会在下一期进行介绍)决定着是否允许用户连接,对于通过帐号密码认证阶段的连接,如果同时通过user表中的权限检查,那么就代表着该用户拥有全局权限,该表中记录的权限信息代表着用户是否拥有该实例下所有数据库的相应全局权限
-
注意:在user表中有任意一个权限列为Y的,就被认为拥有全局权限,所以用户在使用show databases或者使用information_schema的schemata表查询时,可以查询到所有数据库名称列表
下面是该表中存储的信息内容
root@localhost : mysql 12:51:40> select * from mysql.user limit 1\G;
*************************** 1. row ***************************
Host: %
User: qfsys
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: Y
Create_tmp_table_priv: N
Lock_tables_priv: Y
Execute_priv: N
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *3B3D7D2FD587C29C730F36CD52B4BA8CCF4C744F
password_expired: N
password_last_changed: 2017-07-01 14:37:32
password_lifetime: NULL
account_locked: N
1 row in set (0.00 sec)
表字段含义:
-
host和user两个列官方称为范围列,可以理解为这两个字段构成了允许访问的客户端范围以及客户端可以访问的数据库资源范围(这里没有像db表那样的db字段限制库范围,可以理解为整个实例范围的数据库)
* host:代表允许用户从哪些主机访问数据库,可以用通配符和DNS
* user:用户名 -
权限列:从 Select_priv到Create_tablespace_priv及其之间的列,官方称为权限列,每一个列对应一个具体的权限,为Y代表有权限,为N代表没权限
-
以下列官方称为安全列,与客户端与服务端之间的安全、加密通讯有关
* ssl_type:如果用户配置了使用加密ssl连接,则该字段记录用户使用的加密证书类型
* ssl_cipher:表示用于SSL连接握手中可能使用到的密码列表
* x509_issuer:x509证书相关字段
* x509_subject:x509证书相关字段
* plugin:代表该用户使用的密码认证插件名称
* authentication_string:表示用户密码的md5加密字符串
* password_expired:表示用户密码是否过期,为Y试表示用户密码会过期,为N表示用户密码永不过期
* password_last_changed:表示用户密码的最近一次修改时间,该字段如果使用MySQL内建的认证插件(mysql_native_password or sha256_password)则该字段为非空,如果是使用外部认证插件则该字段为空,当使用MySQL内建的认证插件时,该字段初始值为CREATE USER、ALTER USER、SET PASSWORD、GRANT语句执行创建用户或者修改密码时的时间
* password_lifetime:如果password_expired字段为Y,则该字段记录该用户剩余的密码未过期天数,假设该字段值为N,则表示用户需要每N天修改一次密码。如果用户未单独指定该值,则使用全局系统变量default_password_lifetime的值代替。当该字段值为NULL且全局系统变量default_password_lifetime为0时或者该字段值为0时,表示该用户的密码永不过期
* account_locked:代表用户当前状态是锁定状态还是处于激活可用状态 -
以下列官方称为资源控制列,用于限制用户的一些访问资源
* max_questions:代表所有用户每小时的最大并发查询数
* max_updates:代表所有用户每小时最大并发更新次数
* max_connections:代表所有用户每小时的最大并发连接数
* max_user_connections:代表该行记录中的用户每小时的最大并发连接数
2、db
该表提供查询库级别对象权限信息, 该表中记录的权限信息代表着用户是否可以使用这些权限来访问哪些数据库下的所有对象(表或存储程序)
下面是该表中存储的信息内容
root@localhost : mysql 12:53:28> select * from db limit 1\G;
*************************** 1. row ***************************
Host: localhost
Db: performance_schema
User: mysql.session
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
1 row in set (0.00 sec)
表字段含义:
-
host、db、user三个列官方称为范围列,可以理解为这两个字段构成了允许访问的客户端范围以及客户端可以访问的数据库资源范围
* host:与user表的host字段含义相同
* db:代表该用户权限记录所属的哪个库级别范围
* user:与user表的user字段含义相同 -
xxx_priv:与user表的xxx_priv字段含义相同,每一个字段对应相应的权限,,为Y代表有权限,为N代表没权限
* 与user表相比,少了Reload_priv 、Shutdown_priv 、Process_priv 、File_priv、Show_db_priv、Super_priv、Repl_slave_priv、Repl_client_priv、Create_user_priv、Create_tablespace_priv等字段,即代表着这些字段对应的权限是全局范围的,不区分库表级别
3、tables_priv
该表提供查询表表级别权限信息,与db表类似,但粒度更细,tables_priv表中记录的权限信息代表着用户是否可以使用这些权限访问某个表中的所有列
下面是该表中存储的信息内容
root@localhost : mysql 12:54:14> select * from tables_priv;
+-----------+--------+---------------+------------+----------------+---------------------+----------------------------------------------------------------------------------------------+----------------------+
| Host | Db | User | Table_name | Grantor | Timestamp | Table_priv | Column_priv |
+-----------+--------+---------------+------------+----------------+---------------------+----------------------------------------------------------------------------------------------+----------------------+
| localhost | sys | mysql.sys | sys_config | root@localhost | 2017-07-01 14:31:32 | Select | |
| localhost | mysql | mysql.session | user | root@localhost | 2017-12-11 23:41:19 | Select | |
| % | sbtest | xx | sbtest1 | root@localhost | 0000-00-00 00:00:00 | | Select,Insert,Update |
| % | sbtest | test_table | sbtest1 | root@localhost | 0000-00-00 00:00:00 | Select,Insert,Update,Delete,Create,Drop,References,Index,Alter,Create View,Show view,Trigger | |
+-----------+--------+---------------+------------+----------------+---------------------+----------------------------------------------------------------------------------------------+----------------------+
4 rows in set (0.00 sec)
表字段含义:
-
host、db、user、Table_name四个列官方称为范围列,可以理解为这两个字段构成了允许访问的客户端范围以及客户端可以访问的表对象资源范围
-
Table_priv和Column_priv官方称为权限列,对应这表级别权限和列级别权限,需要注意的是,这两列权限列与user和db表不同,这两列是set类型,记录着表级别和列级别的权限集合,而不是对应具体的某个权限。Table_priv对应着表级别的'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger'权限,Column_priv对应着列级别的'Select','Insert','Update','References'权限
-
其他字段:
* Grantor:代表该表中记录的用户权限被谁授予的,即该表中的用户权限在被授予时的current_user函数返回的用户值(account形式)
* Timestamp:代表授予Grantor表示的帐号权限时的时间戳
4、columns_priv
该表提供查询列级别权限信息, 与db表类似,但粒度更细,columns_priv表中记录的权限信息代表着用户可以使用这些权限来访问某个表的指定列
下面是该表中存储的信息内容
root@localhost : mysql 12:55:13> select * from columns_priv;
+------+--------+------+------------+-------------+---------------------+----------------------+
| Host | Db | User | Table_name | Column_name | Timestamp | Column_priv |
+------+--------+------+------------+-------------+---------------------+----------------------+
| % | sbtest | xx | sbtest1 | id | 0000-00-00 00:00:00 | Select,Insert,Update |
+------+--------+------+------------+-------------+---------------------+----------------------+
1 row in set (0.00 sec)
表字段含义:
-
host、db、user、Table_name、Column_name五个列官方称为范围列,可以理解为这两个字段构成了允许访问的客户端范围以及客户端可以访问的列对象资源范围
-
Column_priv官方称为权限列,与tables_priv表中的Column_priv列含义相同,也是一个集合,对应列级别的'Select','Insert','Update','References'权限
-
其他字段
* Timestamp: 与tables_priv表中的Timestamp列含义相同
5、procs_priv
该表提供查询存储程序的权限信息,该表中记录的权限信息代表着用户是否可以使用这些权限来访问指定的存储程序(存储过程和函数)
表字段含义:
-
host、db、user、Routine_name、Routine_type五个列官方称为范围列,可以理解为这两个字段构成了允许访问的客户端范围以及客户端可以访问的存储对象资源
-
Proc_priv官方称为权限列,该权限列也是一个集合类型,代表存储程序的'Execute','Alter Routine','Grant'权限
-
其他列:
* Timestamp: 和tables_priv表中的Timestamp字段含义相同
* Grantor: 和tables_priv表中的Grantor字段含义相同
PS: 该表权限数据为空,目前并未找到使表中填充数据的方法
6、proxies_priv
该表提供查询代理用户权限信息, 该表中记录的权限信息代表着用户可以充当哪些用户的代理,以及用户是否可以将PROXY权限授予其他用户
-
如果一个用户需要将它的PROXY权限授予其他帐号,那么它必须在该表中有一行权限信息,且With_grant字段必须为1
下面是该表中存储的信息内容
root@localhost : mysql 12:58:16> select * from proxies_priv;
+-----------+------+--------------+--------------+------------+----------------------+---------------------+
| Host | User | Proxied_host | Proxied_user | With_grant | Grantor | Timestamp |
+-----------+------+--------------+--------------+------------+----------------------+---------------------+
| localhost | root | | | 1 | boot@connecting host | 0000-00-00 00:00:00 |
+-----------+------+--------------+--------------+------------+----------------------+---------------------+
1 row in set (0.00 sec)
表字段含义:
-
host、user字段含义与前面其他权限表相同
-
Proxied_host和Proxied_user表示被授予proxy权限的account(对应的host和user字符串)
-
其他列的含义和tables_priv含义相同
注意事项: 权限表中一些字段有长度存储限制,具体如下:
-
Host, Proxied_host: 长度限制 60个字符
-
User, Proxied_user: 长度限制 32个字符
-
Password: 长度限制 41个字符
-
Db: 长度限制 64个字符
-
Table_name: 长度限制 64个字符
-
Column_name: 长度限制 64个字符
-
Routine_name: 长度限制 64个字符