二、MySQL权限经验原则:

权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:

1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。

2、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。

3、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。

4、为每个用户设置满足密码复杂度的密码。

5、定期清理不需要的用户。回收权限或者删除用户。

三、MySQL权限实战:

1、GRANT命令使用说明:

先来看一个例子,创建一个只允许从本地登录的超级用户jack,并允许将权限赋予别的用户,密码为:jack.

mysql>grant all privileges on *.* to jack@'localhost' identified by "jack" withgrantoption;
Query OK, 0 rows affected (0.01 sec)

GRANT命令说明:
ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限。

ON 用来指定权限针对哪些库和表。

*.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。

TO 表示将权限赋予某个用户。

jack@'localhost' 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了,localhost一定要放到%的前面才起作用。

IDENTIFIED BY 指定用户的登录密码。

WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。

备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。

2、刷新权限

使用这个命令使权限生效,尤其是你对那些权限表user、db、host等做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用FLUSH PRIVILEGES命令来刷新权限。

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

3、查看权限

MySQL之权限管理_MySQL

查看当前用户的权限:
mysql> show grants;+---------------------------------------------------------------------+| Grants for root@localhost|+---------------------------------------------------------------------+|GRANTALLPRIVILEGESON*.*TO'root'@'localhost'WITHGRANTOPTION||GRANT PROXY ON''@''TO'root'@'localhost'WITHGRANTOPTION|+---------------------------------------------------------------------+2 rows inset (0.00 sec)

查看某个用户的权限:
mysql> show grants for'jack'@'%';+-----------------------------------------------------------------------------------------------------+| Grants for jack@%|+-----------------------------------------------------------------------------------------------------+|GRANT USAGE ON*.*TO'jack'@'%' IDENTIFIED BY PASSWORD '*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0'|+-----------------------------------------------------------------------------------------------------+1 row inset (0.00 sec)

MySQL之权限管理_MySQL

4、回收权限

mysql>revokedeleteon*.*from'jack'@'localhost';
Query OK, 0 rows affected (0.01 sec)

5、删除用户

MySQL之权限管理_MySQL

mysql>select host,user,password fromuser;+-----------+------+-------------------------------------------+| host      |user| password                                  |+-----------+------+-------------------------------------------+| localhost | root ||| rhel5.4| root |||127.0.0.1| root ||| ::1| root ||| localhost |||| rhel5.4|||| localhost | jack |*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0 |+-----------+------+-------------------------------------------+7 rows inset (0.00 sec)

mysql>dropuser'jack'@'localhost';
Query OK, 0 rows affected (0.01 sec)

MySQL之权限管理_MySQL

6、对账户重命名

mysql> rename user'jack'@'%'to'jim'@'%';
Query OK, 0 rows affected (0.00 sec)

7、修改密码

MySQL之权限管理_MySQL

1、用set password命令
mysql>SET PASSWORD FOR'root'@'localhost'= PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)  2、用mysqladmin  [root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd
  备注:
  格式:mysqladmin -u用户名 -p旧密码 password 新密码  3、用update直接编辑user表
  mysql>use mysql
Reading table information for completion oftableandcolumn names
You can turn off this feature to get a quicker startup with-ADatabase changed
mysql>updateuserset PASSWORD = PASSWORD('1234abcd') whereuser='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)  4、在丢失root密码的时候:  [root@rhel5 ~]# mysqld_safe --skip-grant-tables &[1]15953[root@rhel5 ~]# 13091109:35:33 mysqld_safe Logging to'/mysql/mysql5.5/data/rhel5.4.err'.13091109:35:33 mysqld_safe Starting mysqld daemon with databases from/mysql/mysql5.5/data[root@rhel5 ~]# mysql -u root
Welcome to the MySQL monitor.  Commands endwith ; or \g.
Your MySQL connection id is2Server version: 5.5.22 Source distribution

Copyright (c) 2000, 2011, 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> \s--------------mysql  Ver 14.14 Distrib 5.5.22, for Linux (i686) using  EditLine wrapper

Connection id:        2Currentdatabase:    
Currentuser:        root@
SSL:            NotinuseCurrent pager:        stdout
Using outfile:        ''Using delimiter:    ;
Server version:        5.5.22 Source distribution
Protocol version:    10Connection:        Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:            36 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 23  Flush tables: 1Open tables: 18  Queries per second avg: 0.138--------------mysql>use mysql
Reading table information for completion oftableandcolumn names
You can turn off this feature to get a quicker startup with-ADatabase changed
mysql>updateuserset password = PASSWORD('123456') whereuser='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)