mysql配置和管理(转载)

时间:2023-01-25 22:49:15

MySQL的配置与管理

mysql配置和管理(转载) (2012-08-09 13:06:59)

标签:

mysql

配置

管理

分类: MySQL
安装
yum -y install mysql-server
 
启动服务
service mysqld start
 
修改MySQL管理员的命令
当第一次安装MySQL时,访问数据库服务器的用户只能是MySQL管理员,即root用户(注意该用户不同于Linux系统的root用户)。默认情况下,root用户初始化的密码为空,因此从本地客户端连接MySQL时,只需要键入命令mysql即可。
显然这种状态是不安全的,因此应尽快修改MySQL管理员的密码。要修改root用户的密码,可先退出MySQL命令状态(在命令提示符“mysql>”后输入命令quit即可),然后使用下面格式的mysqladmin命令。
mysqladmin -u root password 密码字符串
【例】将root用户密码修改为“kswTG23a”的命令为:
mysqladmin -u root password kswTG23a
修改密码后,该密码立即生效。再想直接用mysql命令连接已经不可能了。此时,要连接MySQL服务器,就必须用以下格式的mysql命令。
mysql [-h 主机名或IP地址] [-u 用户名] [-p]
【例】要以管理员root身份连接到本机上的MySQL,可使用下面的命令。
mysql -u root -p
然后在系统提示“Enter password:”的后面输入密码即可。
此外,如果MySQL服务器的root用户已经设置了密码,再想修改其密码,就必须使用以下格式的mysqladmin命令。
mysqladmin -u root -p password 新密码字符串
【例】将root用户密码再修改为“i1GHW56p”的命令为:
mysqladmin -u root -p password i1GHW56p
该命令执行时,系统要求用户在系统提示“Enter password:”的后面输入旧密码。
 
数据库的创建和删除
在MySQL中,所有的SQL语句都是在用户登录MySQL后,在MySQL命令提示符(“mysql>”)的后面输入的。每个SQL语句都以符号“;”或者“\g”结束,并且用大写和小写字母都可以输入。
1.创建数据库
在MySQL中创建数据库的SQL语句格式为:
create database 数据库名称;
在创建了数据库后,可使用下面的命令查看MySQL当前所有可用的数据库。
show databases;
2.选择数据库
要选择一个数据库,使它成为所有事务的当前数据库,可使用以下格式的SQL语句。
use 数据库名称;
3.删除数据库
要删除一个数据库及其所有表(包括表中的数据),可使用以下格式的SQL语句。
drop database 数据库名称;
 
表的创建、复制、删除和修改
1.创建表
MySQL中创建表,可使用以下格式的SQL语句。
create table 表名称(字段1,字段2,…,字段n,[表级约束])[type=表类型];
其中:
(1)字段i(i=1,2,…,n)的格式为:
字段名 字段类型 [字段约束]
字段类型:规定了某个字段所允许输入的数据的类型,部分常用的字段类型如下表所示:
mysql配置和管理(转载)
字段约束:用来进一步对某个字段所允许输入的数据进行约束,常用的字段约束如下表所示:
mysql配置和管理(转载)
(2)表级约束:用于指定表的主键、外键、索引和唯一约束,如下表所示:
mysql配置和管理(转载)
(3)表类型:用于指定表的类型(即数据的存储格式),如下表所示:
mysql配置和管理(转载)
【例】要在学生选课数据库中创建一个名为student的表(存放学生的有关信息),可输入下面的命令。
mysql配置和管理(转载)
从上图可见,由于创建表的命令较长,为了便于输入和检查,输入命令时可分多行输入,每行用回车键结束,整个命令以符号“;”结束。在创建表后,可用describe命令来查看所创建表的结构。
这里,应注意以下两个问题。
①在一个设计好的数据库中,对于每条记录来说,主键都是不变的、唯一的标识符。这里字段sno被定义为主键,该字段中不允许有重复的值或者null值,并且MySQL会自动为该表的主键(即sno字段)建立索引。
②如果没有指定表的类型,MySQL就默认创建表student的类型为myisam,并且在/var/lib/mysql/xsxk目录下创建student.frm(表定义文件)、student.MDY(数据文件)和student.MYI(索引文件)3个文件。
2.复制表
在MySQL中,可以使用下列的SQL语句来复制表结构。
create table 新表名称 like 源表名称;
另外,用create table 新表名称 select * from 源表名称;命令也可以复制表结构及其内容,但是不能从源表中复制键。
3.删除表
MySQL中删除一个或多个表的SQL语句格式为:
drop table 表名称1[,表名称2,…];
4.修改表
在创建表之后,如果要修改表结构,例如添加、删除或者修改表字段,创建或撤销索引,更改表的名称和类型等,则需要使用alter语句来进行。alter语句的基本格式为:
alter table 表名称更改动作1[,更改动作2,…];
这里的更改动作是由add、drop、change、alter和modify等关键字以及有关字段的定义组成。下面通过实例来介绍alter命令的一些具体使用方法。
(1)增加字段
【例】要在xstable中增加一个字段saddress,可使用下列的命令。
alter table xstable add saddress varchar(25);
(2)更改字段名和字段类型
【例】要将表xstable中字段saddress的名称改为sremark,并将该字段类型改为text,可使用下面的命令。
alter table xstable change saddress sremark text;
注意,即使仅仅改变字段名而不改变字段类型,change子句后面也必须给出该字段的字段类型。
【例】要将表xstable中字段saddress的名称改为sremark,应输入以下的命令。
alter table xstable change saddress sremark varchar(25);
从上面的例子中可以看到,用change子句既可以更改字段名,也可以更改字段类型,但是无论如何,在更改时都必须给出旧的和新的字段名。如果仅仅要更改字段的类型而不更改它的名字,那么还可以用更为简单的modify子句。
【例】要将表xstable中字段sremark的类型text改为varchar,可以使用下面的命令。
alter table xstable modify sremark varchar(25);
需要注意的是,当把一个字段的类型更改为另一种类型时,MySQL自动尝试把字段中的数据转变为新的类型。
(3)删除字段
【例】要删除表xstable中的字段sremark,可使用下面的命令。
alter table xstable drop sremark;
(4)更改表名称
【例】将xstable表的名称更改为xs,可使用下面的命令。
alter table xstable rename to xs;
实际上,使用一条alter table语句就可以完成多项更改任务。
【例】要为表xs增加一个saddress字段,同时将字段sbirthday名称改为sage,类型改为int,并且把表xs的名称改为xstable,可使用下面的命令。
alter table xs add saddress varchar(25),change sbirthday sage int(3),rename to xstable;
 
表中数据的插入、删除和修改
一旦创建了数据库和表,下一步就是在表中储存数据。在MySQL中,通常需要使用SQL的数据操纵语言(DML)来插入、删除和修改表中的记录。
1.插入记录
在MySQL中,在表中插入记录可以使用下面基本格式的SQL语句。
insert into 表名称 (字段名1,字段名2,…) values (字段1的值,字段2的值,…);
【例】要在表student中插入一组数据,可使用下面的命令。
insert into student (sno,sname,ssex,sbirthday,sdepa) values ('0321001','Liu Tao',defalut,19870201,'math');
插入记录后,可以使用select语句来查看所插入的记录是否正确。
select * from student;
此外,在插入记录时,应注意以下几个问题。
①如果在insert语句中给出了要插入记录的各个字段名,那么各字段值的顺序只需与各个字段名的顺序相一致,与表中的顺序(可用describe命令查看)可以不同。但是当使用缩写格式时,各字段值的顺序则必须与表中的顺序相一致。
【例】要插入与前面相同的记录,可使用下面insert命令的缩写格式。
insert into student values ('0321001','Liu Tao',defalut,19870201,'math');
②如果字段列表中没有给出表中的某些字段,当然在字段值列表中也不应给出这些字段的值,那么这些字段的值将会被自动设置为默认值,例如:
insert into student (sno,sname,sbirthday) values ('0321002','Wang Jun',19871012);
这里,由于没有指定ssex字段,因此所插入记录的该字段值将被设为缺省值't'。同样也没有指定sdepa字段,尽管该字段没有定义缺省值,但由于其数据类型为varchar,因此MySQL自动将所插入记录的该字段值设为NULL。
③在一个单独的insert语句中使用多个values子句,可插入多条记录。
【例】可使用insert的命令插入以下两个记录:
insert into student values ('0322001','Zhang Liaoyun','f',19871102,'computer'),('0322002','Li Ming','t',19880116,'computer');
2.删除记录
在MySQL中,从表中删除记录可使用下面基本格式的SQL语句。
delete from 表名称 where 条件表达式;
【例】要删除表student中,sno字段值为'0321002'的记录,可使用下面的命令。
delete from student where sno='0321002';
使用带where子句的delete语句可以删除与指定条件相匹配的记录。只要满足条件,被删除的记录可能只有一条,也可能有多条。
【例】要从表student中删除sno字段值的前4位为'0322'的所有记录(其实际意义是删除0322班所有学生的记录),可使用下面的命令。
delete from student where left(sno,4)='0322';
此外,如果要删除表中的所有记录,则可以使用下面不带where子句的delete命令。
delete from student;
另一种删除表中所有记录的方法是使用下面的truncate命令。
truncate table student;
那么,这两种方法有什么区别呢?其实,truncate命令不管表中有多少条记录,它都是删除表,然后重建该表,而delete命令是将表中所有记录一个一个删除。相比之下,truncate命令要比delete命令快得多,特别是记录非常多时尤为明显。
3.修改记录
除了数据的插入和删除,表中的数据也经常要进行更新,为此,MySQL提供了用于修改记录中数据的SQL语句——update,该语句的基本格式为:
update 表名称 set 字段名1=字段值1[,字段名2=字段值2,…] where 条件表达式;
【例】要修改student表中的sno字段值为'0321002'的记录,将其sbirthday字段值改为19871112、sdepa字段值改为'math',可使用下面的命令。
update student set sbirthday=19871112,sdepa='math' where sno='0321002';
注意:使用update语句时,千万不要忘记带where子句来限制所要修改的记录。如果没有带where子句,那么很可能导致大量数据被破坏。例如,使用下面的update命令将导致所有记录的sdepa字段值被设置为'math':
update student set sdepa='math';
 
索引的创建与删除
为了加快数据查询的速度,MySQL允许用户为一个表的特定字段设置索引,一个索引就是该字段值的一个列表。有了索引,MySQL就不必通过浏览表中的每一行来查找和指定查询条件相匹配的记录,而是通过索引来查找和指定查询条件相匹配的记录。这样,对于一个数据量很大的表来说,由于索引比较小,使用索引后可以显著地减少数据查询的执行时间。
索引既可以在使用create table语句创建表的同时创建,也可以使用create index语句向已存在的表中添加。
1.在创建表的同时创建索引
前面曾经谈到过,在使用create table语句创建表student时,使用primary key子句为该表指定了一个主键sno,那么MySQL会自动为该表的sno字段创建索引。此外,在创建表时,还可以用index子句或unique子句来创建索引。
【例】要创建一个选课课程表course,将课程编号cno字段定义为主键,同时为课程名称cname字段创建一个名为cna的索引,可使用下面的命令。
mysql配置和管理(转载)
此外,如果将子句index cna (cname)改为unique cna (cname),则创建的是unique索引,该索引要求索引字段中的值必须是唯一的,也就是说,表中各条记录中该字段的值不能相同。若向表中插入一个与现有记录中该字段值相同的记录,则会失败。
2.向已存在的表添加索引
使用create index语句可向已存在的表添加索引,该语句的基本格式如下:
create [unique] index 索引名 on 表名称 (字段名1[(长度)],…);
【例】要为表student的sname字段创建名为sna的索引,可使用下面的命令。
create index sna on student (sname);
对于类型为char和varchar的字段,建立索引时还可以指定索引长度值(对于类型为blob和text的字段,索引长度值是必须指定的)。
【例】要为表student的sname字段创建名为sna的索引,并指定索引长度值为10,可使用下面的命令。
create index sna on student (sname(10));
这里指定索引长度值为10,是基于大多数名字通常在前10个字符是不一样的考虑,这样创建的索引文件会更小一些,既可以节省磁盘空间,又可以加速insert等操作。
另外,还需要说明的是,无论使用create index还是使用create table语句建立索引,都可以不指定索引的名字,这时MySQL会自动使用指定字段的字段名为索引命名。
注意:索引可以加快数据查询的速度,但是它会占据一定的磁盘空间,而且它也会影响insert、update和delete命令的执行时间,因为每当表中的记录被添加、修改或删除时,索引都必须更新。
3.删除索引
当不再需要索引时,可使用drop index语句删除它,该语句的格式为:
drop index 索引名 on 表名称;
【例】要删除表student中索引名为sna的索引,可使用下面的命令。
drop index sna on student;
 
用户的创建和删除
前面曾经讲过,在首次安装MySQL时,MySQL会自动授予任何用户都可以从本地连接MySQL服务器,但是只有MySQL管理员root(初始化密码为空)可以完全访问系统中的所有数据库(默认仅有mysql和test这两个数据库),而任何其他用户仅能访问test数据库。
为什么会是这样呢?原来当首次安装MySQL时,MySQL安装程序会在数据库mysql中设置5个MySQL授权表(如下表所示),由这5个授权表共同决定哪个用户可以连接服务器、从哪里连接以及连接后可以执行哪些操作。初始化时,表host、tables_priv和columnts_priv是空的,表user和db就决定了MySQL默认的访问规则。下面以MySQL管理员的身份查看一下表user和db的内容。
 mysql配置和管理(转载)
要查看数据库mysql中表user前4个字段的内容,可使用下面的命令。
select host,user,password,select_priv from mysql.user;
这里要留意一下命令中“mysql.user”的写法,其含义是数据库mysql中的表user。当然,如果事先使用命令use mysql选择了当前使用的数据库,则可将该命令中的“mysql.user”简化为“user”。该命令的执行情况如下图所示。
mysql配置和管理(转载)
在上图中,第1条记录表明,MySQL授予用户root可以从本地(localhost)连接到数据库服务器,并且对服务器中的所有数据库都拥有完全控制的权限(从表user的第4个字段起的所有关于权限的字段值都是“Y”);第4条记录表明,任何其他用户(对应表user中的字段user值为空,相当于匿名用户)也可以从本地(localhost)连接到数据库,但是对系统中所有数据库都没有访问权限(从表user的第4个字段起的所有关于权限的字段值都是“N”)。
要查看数据库mysql中db的前4个字段内容,可使用下面的命令。
select host,db,user,select_priv from mysql.db;
命令的执行情况如下图所示:
mysql配置和管理(转载)
从上图可见,表db定义了任何用户都可以从任何主机访问数据库test(或以test开头的),并且对该数据库拥有完全的访问权限(从表db的第4个字段起的所有关于权限的字段值都是“Y”)。这里的字符“%”被用作通配符,字符“\_”被用作转义符。
虽然在表db中定义了允许任何用户可以从任何主机访问数据库test,但由于在表user中限制任何用户只能从本地(localhost)来连接数据库服务器,因此在这两个表的共同作用下,MySQL默认设置是任何用户只能从本地完全访问数据库test。
此外,由于MySQL默认允许用户root(初始化时无密码)可以从本地连接数据库服务器,并且可以完全访问系统上的所有数据库,因此为安全起见,应尽快为MySQL管理员(root用户)设置密码。
在明白了上述道理之后,下面用一种直观的方法来为数据库服务器创建/删除新用户,以及更改用户密码。
1.创建新用户
要创建一个新用户guest,并为他设置密码,同时允许它从任何主机连接到数据库服务器,可按以下步骤进行设置。
①以MySQL管理员身份从本地连接到数据库服务器,可使用以下的命令实现。
mysql -u root -p
②创建新用户guest,并为他设置密码,同时允许他从任何主机连接到数据库服务器,可使用下面的命令实现。
insert into mysql.user (host,user,password) values ('%','guest',password('guest'));
此处必须使用password()函数,该函数会为密码加密,这样在表user的字段password中保存的就是经过加密的密码。
③重载MySQL授权表,可使用下面的命令实现。
flush privileges;
上面3条命令的执行情况如下图所示。
mysql配置和管理(转载)
设置完成后,要测试新建用户是否可以使用,可以在远程客户端使用下面的命令来连接该数据库服务器。
mysql -h MySQL服务器IP地址 -u guest -p
这里,用选项“-h”来指定所连接的数据库服务器的IP地址或域名。具体测试情况如下图所示。
mysql配置和管理(转载)
从上图可见,用户guest在输入正确的密码(guest)后,就可以从远程客户端连接到数据库服务器。连接成功后,用命令show databases查看当前用户可用的数据库,只能看到数据库尝试访问它成功。
如果在Linux系统中开启了防火墙,要让远程客户端连接到Linux系统中的数据库服务器,还需关闭防火墙功能或设置允许TCP端口3306通过。例如,可用使用下面的命令开放TCP端口3306。
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
2.删除用户
删除用户应使用delete语句。
【例】要删除用户guest,可使用下面的命令:
delete from mysql.user where user='guest';
注意,删除后不要忘记用flush privileges命令重载MySQL授权表。删除用户guest的执行情况如下图所示。
mysql配置和管理(转载)
3.更改用户密码
由于MySQL授权表实际上与MySQL常规表没有什么本质区别,因此也可以用update语句来修改其内容,包括修改用户密码。
【例】要将用户guest的密码改为“123456”,可使用下面的命令。
update mysql.user set password=password('123456') where user='guest';
flush privileges;
这两条命令的执行情况如下图所示。
mysql配置和管理(转载)
此外,还有一种更简单的更改用户密码的方法。例如,要将用户guest的密码更改为“guest”,可使用下面的命令:
set password for guest@'%'=password('guest');
这里,guest@'%'的基本格式为“用户名@客户端的域名”。字符%是通配符,使用通配符时可用单引号将它括起来,例如,tom@'%.gdvcp.net'。这条命令的执行情况如下图所示。
mysql配置和管理(转载)
需要说明的是,当使用set password语句来更改用户的密码时,不需要执行flush privileges语句来重载MySQL授权表。
 
用户权限的设置
从前面可知,MySQL授权表是用来控制用户连接数据库服务器和访问数据库的权限,那么授权表中究竟有哪些用来设置权限的字段呢?实际上,MySQL授权表中权限字段有以下两种形式。
(1)在表user、db和host中,所有权限字段都被声明为ENUM('N','Y'),即每一个权限字段值都可以被设置为'N'或'Y',并且缺省值为'N'。下表列出了表user、db和host中可设置权限的字段。
mysql配置和管理(转载)
注:表中带“*”号的字段是授权表user、db和hsot共有的字段,而不带“*”号的字段仅是授权表user中的字段。
(2)在表tables_priv和columns_priv中,权限字段被声明为set类型,即可以从所定义的权限集合中选择任意个权限。下表列出了表tables_priv和columns_priv中权限字段及可设置的权限。
mysql配置和管理(转载)
MySQL提供了两种修改授权表中的访问权限的方法,一种是使用insert、update和delete等DML语句来手工修改表中的信息;另一种是使用grant和revoke语句。前者比较直观,但由于各授权表中字段数很多,很容易出错,通常不推荐这么做,而后者更好。下面主要介绍后者的具体使用方法。
1.使用grant语句授权
grant语句的基本格式如下:
grant 权限列表 [(字段列表)] on 数据库名称.表名称
to 用户名@域名或IP地址
[indentified by '密码值'] [with grant option];
下面将通过一些例子来说明如何使用grant语句来进行授权。
(1)授予哪个用户能连接,从哪里连接
例如,要授予用户guest可以从任意主机连接到数据库服务器,并具有完全访问学生选课数据库xsxk的权限,则可使用下面的命令。
grant all on xsxk.* to guest@'%' identified by 'guest';
该命令的执行情况如下图所示。
mysql配置和管理(转载)
这里需要说明的有以下几点。
■使用grant语句授权时,如果指定用户名不存在,MySQL就会创建这个新用户,显然用这种方法创建新用户比直接修改授权表user更好。
■在grant语句中的“权限列表”处使用关键字all,表示授予全部的权限,此外,还可以使用关键字usage,表示不授予任何权限。
■在grant语句中的“数据库名称.表名称”处可以使用通配符“*”,本例中的“xsxk.*”表示数据库xsxk中的所有表。
■grant语句中的“用户名@域名或IP地址”用来设置谁能连接,从哪里连接;用户名不能使用通配符,但可以用''(空字符串)表示任何用户(相当于匿名用户);域名或IP地址可以使用通配符“%”,在使用通配符时必须使用单引号将域名或IP地址括起来。下表列出了设置“域名或IP地址”的几种常见情况。
mysql配置和管理(转载)
■在grant语句中使用identified by子句,可设置用户连接数据库服务器时使用的密码,这里不需要使用函数password(),而直接使用明文,grant语句会自动将设置的明文密码加密并保存到授权表user中。此外,对于新用户,如果不指定identified by子句,那么MySQL将不为该用户设置密码(不安全);对已有的用户,任何设置的密码将代替旧密码,如果不指定密码,则旧密码仍保持不变。
(2)授予用户不同级别的访问权限
例如,要新建一个用户tom,让他能从子网192.168.16.0中任何主机连接到数据库服务器,可以读取数据库xsxk的内容,并且能修改表course中字段teacher的值,可使用下面的命令。
grant select on xsxk.* to tom@'192.168.16.%' identified by '123456';
grant update(teacher) on xsxk.course to tom@'192.168.16.%';
上面两条命令的执行情况如下图所示。
mysql配置和管理(转载)
接下来浏览MySQL的各个授权表,看上面两条命令究竟做了些什么。
①使用下面的命令来查看mysql.user表中与用户tom有关的记录。
select host,user,password,select_prive from mysql.user where user='tom';
命令的执行情况如下图所示。
mysql配置和管理(转载)
从上图可见,MySQL创建了用户tom并设置了密码(经过加密),该用户可以从子网192.168.16.0/24中的任何主机连接到数据库服务器,但是由于授权表user中与用户tom对应的用来设置全局权限的各个字段值(如select_priv)都为'N',因此MySQL并没有授予用户tom任何全局权限,该用户能否访问某个数据库还要看其他授权表中的设置。
②使用下面的命令来查看mysql.db表中与用户tom有关的记录。
select host,db,user,select_priv,insert_priv from mysql.db where user='tom';
命令的执行情况如下图所示。
mysql配置和管理(转载)
从上图可见,由于授权表db中与用户tom对应的用来设置数据库级权限的各权限字段值中只有select_priv字段值为'Y',而其他权限字段值(如insert_priv字段值)都为'N',所以MySQL授予用户tom只能浏览数据库xsxk的内容。
③使用下面的命令来查看mysql.host表中的内容。
select * from mysql.host;
命令的执行情况如下图所示。
mysql配置和管理(转载)
从上图可见,表mysql.host是空表。实际上,grant语句不会改变mysql.host文件的内容。
④使用下面的命令来查看mysql.tables_priv表的内容。
select db,user,table_name,table_priv,column_priv from mysql.tables_priv;
命令的执行情况如下图所示。
mysql配置和管理(转载)
从上图可见,由于授权表tables_priv中与用户tom对应的用于设置表级权限的table_priv字段值为空,因此MySQL并没有给用户tom设置表级权限。但是因为对应的column_priv字段值为Update,所以将由mysql.columns_priv表来确定字段级权限。
⑤使用下面的命令来查看mysql.columns_priv表的内容。
select db,user,table_name,column_name,column_priv from mysql.columns_priv;
该命令的执行情况如下图所示。
mysql配置和管理(转载)
从上图可见,由于授权表columns_priv中与用户tom对应的用于指定字段级权限的column_priv字段值为Update,因此MySQL授予用户tom对表course的teacher字段有Update(修改)权限。
下面再对授予用户不同级别的访问权限做以下几点说明。
■grant语句中的“数据库名称.表名称”是用来设置权限运用的级别,权限可以是全局的(适用于所有数据库和所有表)、指定数据库的(适用于一个数据库中的所有表)或指定表的,如下表所示。
mysql配置和管理(转载)
■grant语句中的“字段列表”是用来设置权限运用于指定表中的哪些字段,例如:
update(teacher)表示update权限运用于指定表(course)中的teacher字段;若要运用于指定表的多个字段,则可用“,”号分隔各个字段,如update(cname,teacher)。
■必须注意grant语句中的“权限列表”可指定的权限与权限运用级别有关,例如有些权限(file、process、reload和shutdown)作为管理权限只能用于全局级别,而对于字段级只能指定select、insert、update和references等4个权限。
注记:
MySQL是如何控制客户机访问的?
在使用MySQL时,客户机访问控制分以下两个阶段:
(1)第一阶段发生在连接数据库服务器,MySQL查找user表看看是否能够找到与用户的名字、正在连接的客户机以及所提供的密码相匹配的项。若不匹配,则不能连接;若匹配,则建立连接。
(2)第二阶段发生在建立连接之后,在此阶段中,对于该用户发布的每个命令,MySQL都会检查各个授权表以查看该用户是否具有充足的权限来执行该命令,该用户是否有权可由下面的逻辑表达式决定:
user OR (db AND host) OR tables_priv OR columns_priv
逻辑表达式中的各个授权表实际上是指各表中与该用户相关的记录;第二阶段继续,直到与该数据库服务器的会话结束为止。
(3)授予用户管理权限的权利
例如,MySQL管理员要授予用户admin可以从本地连接到数据库服务器,对学生选课数据库xsxk具有完全访问权限,并可将其所拥有的权限授予其他用户,可使用下面的命令。
grant all on xsxk.* to admin@localhost identified by 'sW56$Azx' with grant option;
注意,grant语句中的with grant option子句用来设置允许用户将自己所拥有的权限授予其他用户。该命令的具体执行情况如下图所示。
mysql配置和管理(转载)
现在用户admin@localhost对数据库xsxk已经具有完全访问的权限,又可以将其所拥有的权限授予其他用户,那么当用户admin从本地连接到数据库服务器后,就可以使用下面的命令给其他用户(如bill)授权。
grant select on xsxk.student to bill@localhost;
命令的执行情况如下图所示。
mysql配置和管理(转载)
值得注意的是,本例中当用户admin用grant语句为bill授权时,不能用identified by子句为用户bill设置密码,这是因为用户admin仅对数据库xsxk具有完全访问的权限。此外,授权时,只能用bill@localhost,而不能用bill@'%',这同样是因为用户admin只能把自己拥有的权限授予其他用户。授权后,用户bill可以从本地连接到数据库服务器(没有密码),然后只能浏览表xsxk.student的内容,而不能做其他操作。
每当为用户授权后,MySQL管理员都可以使用show grants语句来检查授予该用户的权限是否正确。例如,可使用下面的命令来检查用户admin@localhost的权限。
show grants for admin@localhost;
命令的执行情况如下图所示。
mysql配置和管理(转载)
2.使用revoke语句撤权
revoke语句的基本格式如下:
revoke 权限列表 [(字段列表)] on 数据库名称.表名称 from 用户名@域名或IP地址
【例】MySQL管理员要撤销用户admin@localhost对数据库xsxk所拥有的创建、删除数据库及表的权限,并撤销该用户可以把自己所拥有的权限授予其他用户的权限,可使用下面的命令。
revoke create,drop on xsxk.* from admin@localhost;
revoke grant option on xsxk.* from admin@localhost;
此处的第二条命令用来撤销用户admin可以把自己所拥有的权限授予其他用户的权限。这两条命令的执行情况如下图所示。
mysql配置和管理(转载)
值得注意的是,revoke语句中的“用户名@域名或IP地址”部分必须匹配原来grant语句中的“用户名@域名或IP地址”部分,而“权限列表”部分可以是原来grant语句所授权限的一部分权限。此外,revoke语句只能撤销权限,而不能删除用户账户,在授权表user中仍保留该用户的记录,这意味着该用户仍然可以连接到数据库服务器。所以,要完全删除该用户,还应该使用delete语句从user表中删除该用户记录。