MySQL是一个数据库集成开发工具(也可叫MySQL服务器),可以在MySQL里面创建自己定义的各种数据库,但是MySQL一旦安装好了,就会有初始的一些数据库,这些数据库是MySQL的配置、权限等等这类似的系统级的数据库,比如MySQL工具中有一个mysql数据库,里面就有user表格用于存储整个MySQL的用户信息。

MySQL服务器里有个mysql数据库,里面有很多表,用于存储各种信息,比如:用户、权限、访问控制、存储过程等等。

1. 权限表(拥有的权限是对于整个MySQL服务器而言的)

权限表有:user、db、tables_priv、columns_priv和procs_priv。下面我们一一介绍。

1.1 user表

    user表是MySQL服务器中最重要的一个权限表,记录允许连接到服务器的账户信息,user表的列可分为4类:用户列、权限列、安全列和资源控制列。 用户表如下,45个字段:

db和user表 mysql mysql数据库user表_数据库

           

db和user表 mysql mysql数据库user表_db和user表 mysql_02

用户列。Host、User、Password分别表示主机名、用户名和密码,password_expired 表示密码是否过期,password_last_changed表示密码上次修改的日期,password_lifetime表示密码的有效期,account_locked表示用户是否被锁住了。

权限列。决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作,包括查询权限、修改权限等普通权限,还包括了关闭服务器、超级权限和加载用户等高级权限。普通权限用于操作数据库,高级权限用于数据库管理。凡是名字有后缀_priv的都是权限列。

安全列。6列:ssl_type、ssl_cipher、x509_issuer、x509_subject、plugin、authentication_string。ssl用于加密,x509用于标识用户,后面两个用于授权插件,比如验证用户身份的插件。

 

资源控制列。4列:max_questions(用户每小时运行执行的查询操作次数)、max_updates(用户每小时运行执行的更新操作次数)、max_connections(用户每小时允许执行的连接操作次数)、max_user_connections(用户允许同时建立的连接次数),如果一小时内操作次数用完了,只能等下一小时才能继续操作。

1.2 db表

db表用于存储的信息是:用户对某个数据库的操作权限。这个表里的信息决定了用户能从哪个主机对哪个数据库进行什么操作。

db和user表 mysql mysql数据库user表_db和user表 mysql_03

1.3 tables_priv表

存储的是:用户对某个表的操作权限。 Host代表用户主机名,Db数据库名,User用户名,Table_name表名,Grantor表示是哪个用户修改了tables_priv表的此记录,Timestamp表示修改此记录的时间,Table_priv存的是对此表可以有的操作权限(set可以存储多个权限),Column_priv表示对表里的所有列的操作权限。

db和user表 mysql mysql数据库user表_MySQL_04

1.4 column_priv表

存的是:用户对某表里的某一列的操作权限。Column_name表示列名,Column_priv表示权限,其余的列和其它表里的一个意思。tables_priv里的列权限是对所有列的操作权限,而这里的Column_priv表示仅仅此列的操作权限。

db和user表 mysql mysql数据库user表_服务器_05

1.5 procs_priv 表

存的是:用户对存储过程和存储函数的操作权限。Routine_name表示存储过程名或者存储函数名,Routine_type表示类型(FUNCTION 或 PROCEDURE),Grantor表示修改此记录的用户,Proc_priv表示操作权限,Timestamp表示操作此记录的时间。

db和user表 mysql mysql数据库user表_数据库_06

 

 

2. 用户账户管理

待续。。。

mysql数据库中的3个权限表:user 、db、 host

权限表的存取过程是:

    1)先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;

    2) 通过权限验证,进行权限分配时,按照user?db?tables_priv?columns_priv的顺序进行分配。即先检查全局权限表 user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。