MySQL权限管理
权限系统的工做原理
MySQL权限系统经过下面两个阶段进行认证:
(1)对链接的用户进行身份认证,合法的用户经过认证、不合法的用户拒绝链接。
(2)对经过认证的合法用户赋予相应的权限,用户能够在这些权限范围内对数据库作相应的操做。
对于身份,MySQL是经过IP地址和用户名联合进行确认的,例如MySQL安装默认建立的用户root@localhost表示用户root只能从本地(localhost)进行链接才能够经过认证,此用户从其余任何主机对数据库进行的链接都将被拒绝。也就是说,一样的一个用户名,若是来自不一样的IP地址,则MySQL将其视为不一样的用户。
MySQL的权限表在数据库启动地时候就载入内存,当用户经过身份认证后,就在内存中进行相应权限的存取,这样,此用户就能够在数据库中作权限范围内的各类操做了。
权限表的存取
在权限存取的两个过程当中,系统会用到“mysql”数据库(安装MySQL时被建立,数据库名字叫“mysql”)中user、host和db这3个最重要的权限表
表名 |
user |
db |
host |
用户列 |
User |
Host |
Host |
|
Password |
Db |
Db |
权限列 |
Select_priv |
User |
Select_priv |
|
Insert_priv |
Select_priv |
Insert_priv |
|
Update_priv |
Insert_priv |
Update_priv |
|
Delete_priv |
Update_priv |
Delete_priv |
|
Create_priv |
Delete_priv |
Create_priv |
|
Drop_priv |
Create_priv |
Drop_priv |
|
Reload_priv |
Drop_priv |
Grant_priv |
|
Shutdown_priv |
Grant_priv |
References_priv |
|
Process_priv |
References_priv |
Index_priv |
|
File_priv |
Index_priv |
Alter_priv |
|
Grant_priv |
Alter_priv |
Create_tmp_table_priv |
|
References_priv |
Create_tmp_table_priv |
Lock_tables_priv |
|
Index_priv |
Lock_tables_priv |
Create_view_priv |
|
Alter_priv |
Create_view_priv |
Show_view_priv |
|
Show_db_priv |
Show_view_priv |
Create_routine_priv |
|
Super_priv |
Create_routine_priv |
Alter_routine_priv |
|
Create_tmp_table_priv |
Alter_routine_priv |
Execute_priv |
|
Lock_tables_priv |
Execute_priv |
Trigger_priv |
|
Execute_priv |
Event_priv |
|
|
Repl_slave_priv |
Trigger_priv |
|
|
Repl_client_priv |
|
|
|
Create_view_priv |
|
|
|
Show_view_priv |
|
|
|
Create_routine_priv |
|
|
|
Alter_routine_priv |
|
|
|
Create_user_priv |
|
|
|
Event_priv |
|
|
|
Trigger_priv |
|
|
|
Create_tablespace_priv |
|
|
安全列 |
ssl_type |
|
|
|
ssl_cipher |
|
|
|
x509_issuer |
|
|
|
x509_subject |
|
|
|
max_questions |
|
|
|
max_updates |
|
|
|
max_connections |
|
|
|
max_user_connections |
|
|
在这个3表中,最重要的表
其中,一般用得最多的是用户列和权限列,其中权限列在分为普通权限和管理权限。普通权限主要用于数据库的操做,好比select_priv、create_priv等。而管理权限主要用来对数据库进行管理的操做,好比process_priv、super_priv等。
当用户进行链接的时候,权限表的存取过程有如下现个阶段。
- 先从user表中的host、user和passwd这3个字段中判断链接的IP、用户名和密码是否存在于表中,若是存在,则经过身份验证,不然拒绝链接。
- 若是经过身份验证,则按照如下权限表的顺序获得数据库权限:user->db->tables_priv->coloumns_priv。
在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。
上面的第一阶段好理解,下面以一个例子来详细解释一下第二阶段。
(1)建立用户cqh@localhost,并赋予全部数据库的全部表的select权限。
mysql> grant select on *.* to cqh@localhost;
Query OK, 0 rows affected (0.05 sec)
mysql> select * from user where user='cqh' and host='localhost' \G
*************************** 1. row ***************************
Host: localhost
User: cqh
Password:
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
...
(2)再来看db表:
mysql> select * from db where user='cqh';
Empty set (0.00 sec)
能够发现,user表的select_priv列是“Y”,而db表中并无记录,也就是说,对全部数据库都具备相同的权限的用户记录并不须要记入db表,而仅仅须要将user表中的select_priv改成“Y”便可。换句话,user表中的每一个权限都表明了对全部数据库都有的权限。
(3)将cqh@localhost上的权限改成只对test数据库上全部表的select权限。
mysql> revoke select on *.* from cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> grant select on test.* to cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user='cqh' and host='localhost' \G
*************************** 1. row ***************************
Host: localhost
User: cqh
Password:
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
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:
authentication_string: NULL
1 row in set (0.00 sec)
mysql> select * from db where user='cqh'\G
*************************** 1. row ***************************
Host: localhost
Db: test
User: cqh
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)
这个时候发现,user表中的select_priv变为“N”,而db表中则增长了db为test的一条记录,也就是说,当只授予数据库某些权限时,user表中的相应权限时,user表中的相应权限列保持“N”,而将具体的数据库权限写入db表。
table和column的权限机制和db相似,这里就再也不赘述了。
从上面的例子能够看出,当用户经过权限认证,进行权限分配时,将按照user->db->tables_priv->coloumns_priv的顺序进行权限分配,即先检查全局权限表user,若是user中对应权限为“Y”,则此用户对全部数据库的权限都为“Y”,将再也不检查db、tables_priv和coloumns_priv;若是为“N”,则到db表中检查此用户对应的具体数据库,并获得db中为“Y”的权限;若是db中相应的权限为“N”,则检查tables_priv中此数据库对应的具体表,取得表中为“Y”的权限;若是tables_priv中相应权限为“N”,则检查columns_priv中此表对应的具体列,取得列中为“Y”的权限。
帐号管理
帐号管理主要包括帐号的建立、权限更改和帐号的删除。用户链接数据库的第一步都从帐号建立开始。
有两种方法能够用来建立帐号:使用GRANT语法建立或者直接操做受权表,但更推荐使用第一种方法,由于操做简单,出错概率更少。
方式一.建立帐号
GRANT的经常使用语法以下 :
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
GRANT PROXY ON user_specification
TO user_specification [, user_specification] ...
[WITH GRANT OPTION]
object_type:
TABLE
| FUNCTION
| PROCEDURE
来看下面的几个例子。
例1:建立用户cqh,权限为能够在全部数据库上执行全部权限,只能从本地进行链接。
mysql> grant all privileges on *.* to cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user='cqh' and host='localhost' \G
*************************** 1. row ***************************
Host: localhost
User: cqh
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
1 row in set (0.00 sec)
能够发现,除了Grant_priv权限外,全部权限在user表里都是“Y”。
例2:在例1基础上,增长对cqh的grant权限
mysql> grant all privileges on *.* to cqh@localhost with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user='cqh' and host='localhost' \G
*************************** 1. row ***************************
Host: localhost
User: cqh
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
1 row in set (0.00 sec)
例3:在例2基础上,设置密码为“123”。
mysql> grant all privileges on *.* to cqh@localhost identified by '123' with grant option;
Query OK, 0 rows affected (0.00 sec)
从user表中查看修改的密码:
mysql> select * from user where user='cqh' and host='localhost' \G
*************************** 1. row ***************************
Host: localhost
User: cqh
Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
1 row in set (0.00 sec)
能够发现,密码变成了一堆加密后的字符串。在MySQL5.0里面,密码的算法是生成一个以*开始的41位的字符串,而MySQL4.0以前是16位,所以安全性大大提升。
例4:建立新用户chenqionghe,能够从任何IP进行链接,权限为test数据库里的全部表进行SELECT、UPDATE、INSERT和DELETE操做,初始密码为“123”。
mysql> grant select,insert,update,delete on test.* to 'chenqionghe'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user='chenqionghe' and host='%' \G
*************************** 1. row ***************************
Host: %
User: chenqionghe
Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
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:
authentication_string: NULL
1 row in set (0.00 sec)
mysql> select * from db where user='chenqionghe' and host='%' \G
*************************** 1. row ***************************
Host: %
Db: test
User: chenqionghe
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
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)
如上文所述,user表中的权限都是“N”,db表中增长的记录权限则都是“Y”。通常地,咱们只授予用户适当的权限,而通常不会授予过多的权限,本例中的权限适合大多数应用帐号。
本例中的IP限制为全部IP均可以链接,所以设置为“*”,mysql数据库中是经过user表的host字段来进行控制,host能够是如下类型的值。
- Host值能够是主机名或IP号,或“localhost"批出本地主机
- 能够在Host列值使用通配符字符“%”和“_”。
- Host值“%”匹配任何主机名,空Host值等价于“%”。它们的含义与LIKE操做符的模式匹配操做相同。例如,“%”的Host值与全部主机名匹配,而“%.mysql.com”匹配mysql.com域的全部主机。
host和user组合进行链接的例子
Host值 |
User值 |
被条目匹配的链接 |
cqh.loc.gov |
cqh |
cqh,从cqh.loc.gov链接 |
cqh.loc.gov |
|
任何用户,从cqh.loc.gov链接 |
% |
cqh |
cqh,从任何主机链接 |
% |
|
任何用户,从任何主机链接 |
%.loc.gov |
cqh |
cqh,从在loc.gov域的任何主机链接 |
x.y.% |
cqh |
cqh,从x.y.net、x.y.com、x.y.edu等链接 |
114.115.166.177 |
cqh |
cqh,从有114.115.166.177IP地址的主机链接 |
114.115.166.% |
cqh |
cqh,从144.155.166C类子网的任何主机链接 |
可能你们会有这样的疑问,若是权限表中的Host既有“cqh.loc.gov”,又有“%”,而此时,链接从主机cqh.loc.gov过来。显然,user表里面这两条记录都符合匹配条件,那系统会选择哪个呢?
若是有多个匹配,服务器必须选择使用哪一个条目。按照下述原则来解决:
- 服务器在启动时读入user表后进行排序;
- 而后当用户试图链接时,以排序的顺序浏览条目;
- 服务器使用与客户端和用户名匹配的第一行。
当服务器读取表时,它首先以最具体的Host值排序。主机名和IP号是具体的。“%”意味着“任何主机”而且是最不特定的。有相同Host值的条目首先以最具体的User值排序(空User值意味着“任何用户”而且是最不特定的)。
注意:mysql数据库的user表中host值为%或者空,表示全部外部IP均可以链接,可是不包括本地服务器local,所以,若是要包括本地服务器、必须单独为local赋予权限。
例5:授予SUPER、PROCESS、FILE权限给用户cqh2@%;
mysql> grant super,process,file on *.* to 'cqh2'@'%';
Query OK, 0 rows affected (0.00 sec)
由于这几个权限都属于管理权限,所以不可以指定某个数据库,on后面必须跟“*.*”,下面的语法将提示错误:
mysql> grant super,process,file on test.* to 'cqh2'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
例6:只授予登陆权限给cqh3@localhost
mysql> grant usage on *.* to 'cqh3'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[root@iZ28dr6w0qvZ ~]# mysql -ucqh3
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1640
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
usage权限只能用于数据库登陆,不能执行任何操做。
直接操做权限表也能够进行权限的建立,其实GRANT操做的本质就是修改权限后进行权限的刷新,所以,GRANT比操做权限表更简单,下面继续以上文的例子来讲明一下更新权限的用法。
建立新用户chenqionghe,能够从任何IP进行链接,权限对test库里的全部表进行SELECT、UPDATE、INSERT和DELETE,初始密码为123
mysql> grant select,insert,update,delete on test.* to 'chenqionghe'@'%' identified by '123';
方式二:直接操做权限表
直接操做权限表以下:
[root@iZ28dr6w0qvZ ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1560
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql;
Database changed
mysql> insert into db (host,db,user,select_priv,insert_priv,update_priv,delete_priv) values ('%','test','chenqionghe','Y','Y','Y','Y');
Query OK, 1 row affected (0.00 sec)
mysql> flush privileges;
mysql> exit;
Bye
[root@iZ28dr6w0qvZ ~]# mysql -ucqh3
ERROR 1045 (28000): Access denied for user 'cqh3'@'localhost' (using password: NO)
[root@iZ28dr6w0qvZ ~]# mysql -ucqh3 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1643
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
查看和更改帐号的权限
建立完帐号后,时间长了可能就会忘记分配的权限而须要查看帐号权限,也在可能会通过一段时间后须要更改之前的帐号权限,下面介绍查看和更改这两种操做命令。
帐号建立好后,能够经过以下命令查看权限;
show grants for user@host;
如如下示例
mysql> show grants for cqh@localhost;
+---------------------------------------------------------------------------------------------------------------------------------------+
| Grants for cqh@localhost |
+---------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'cqh'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
| GRANT SELECT ON `test`.* TO 'cqh'@'localhost' |
+---------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
host能够不写,默认是“%”,以下所示
mysql> show grants for chenqionghe;
+------------------------------------------------------------------------------------------------------------+
| Grants for chenqionghe@% |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'chenqionghe'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
对于MySQL5.0之后的版本,也能够利用新新增的information_schema数据库进行权限的查看;
mysql> select * from SCHEMA_PRIVILEGES where grantee="'cqh'@'localhost'";
+-------------------+---------------+--------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------+---------------+--------------+----------------+--------------+
| 'cqh'@'localhost' | def | test | SELECT | NO |
+-------------------+---------------+--------------+----------------+--------------+
1 row in set (0.00 sec)
能够进行权限的新增和回收。和帐号建立同样,权限变动也在两种办法:使用GRANT(新增)和REVOKE(回收)语句,或者更改权限表。
第二种方法和前面同样,直接对user、db、tables_priv和columns_priv中的权限进行更新便可,这里重点介绍第一种方法。
和建立帐号的语法彻底同样,GRANT能够直接用来对帐号进行增长。其实GRANT语句在执行的时候,若是权限表中不存在目标帐号,则建立帐号;若是已经存在,则执行权限的新增。来看下面一个例子。
(1)cqh3@localhost目前只有登陆的权限。
mysql> show grants for cqh3@localhost;
+------------------------------------------+
| Grants for cqh3@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
(2)赋予cqh3@localhost全部数据库上的全部表的SELECT权限。
mysql> grant select on *.* to 'cqh3'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh3@localhost;
+-------------------------------------------+
| Grants for cqh3@localhost |
+-------------------------------------------+
| GRANT SELECT ON *.* TO 'cqh3'@'localhost' |
+-------------------------------------------+
1 row in set (0.00 sec)
(3)继续给cqh3@localhost赋予SELECT和INSERT权限,和已胡的SELECT权限进行合并。
mysql> show grants for cqh3@localhost;
+-------------------------------------------+
| Grants for cqh3@localhost |
+-------------------------------------------+
| GRANT SELECT ON *.* TO 'cqh3'@'localhost' |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> grant select,insert on *.* to 'cqh3'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh3@localhost;
+---------------------------------------------------+
| Grants for cqh3@localhost |
+---------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'cqh3'@'localhost' |
+---------------------------------------------------+
1 row in set (0.00 sec)
(4)REVOKE语句能够回收已经赋予的权限,语法以下:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
对于上面的例子,这里决定要收回cqh3@localhost上的INSERT和SELECT权限:
mysql> revoke select,insert on *.* from cqh3@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh3@localhost;
+------------------------------------------+
| Grants for cqh3@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
usage权限不能被回收,也就是说,REVOKE用户并不能删除用户。
mysql> show grants for cqh3@localhost;
+------------------------------------------+
| Grants for cqh3@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> revoke usage on *.* from cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh3@localhost;
+------------------------------------------+
| Grants for cqh3@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
方法1:能够用mysqladmin命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "newpwd"
方法2:执行SET PASSWORD语句。下例中将帐号'chenqionghe'@'%'的密码改成“cqh123”
SET PASSWORD FOR 'chenqionghe'@'%' = PASSWORD('cqh123');
若是是更改本身的密码,能够省略for语句:
SET PASSWORD = PASSWORD('cqh123');
方法3:还能够在全局级别使用GRANT USAGE语句(在*.*)来指定某个帐户的密码而不影响帐户当前的权限。
GRANT USAGE ON *.* TO 'chenqionghe'@'%' IDENTIFIED BY 'cqh123';
方法4:直接更改数据库的user表。
mysql> INSERT INTO user (Host,User,Password) VALUES('%','chenqionghe',PASSWORD('333333'));
mysql> FLUSH PRIVILEGES;
mysql> UPDATE user SET Password = PASSWORD('333333') WHERE Host='%' AND User='chenqionghe';
mysql> FLUSH PRIVILEGES;
注意:更改密码的时候必定要使用PASSWORD函数(mysqladmin和GRANT两种方式不用写,会自动加上)。
要完全删除帐号,一样也有两种方法:DROP USER命令和修改权限表。
DROP USER语法很是简单,具体以下:
DROP USER user [, user] ...
举一个单的例子,将cqh3@localhost用户删除
mysql> show grants for cqh3@localhost;
+------------------------------------------+
| Grants for cqh3@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> drop user cqh3@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh3@localhost;
ERROR 1141 (42000): There is no such grant defined for user 'cqh3' on host 'localhost'
修改权限表方法只要把user用户中的用户记录删除便可,这里再也不演示
把衣钵都传给大家了,别忘了点个赞哦~