mysql 用户及权限管理

MySQL 默认有个root用户,可是这个用户权限太大,通常只在管理数据库时候才用。若是在项目中要链接 MySQL 数据库,则建议新建一个权限较小的用户来链接。mysql

在 MySQL 命令行模式下输入以下命令能够为 MySQL 建立一个新用户:sql

1数据库

CREATE USER username IDENTIFIED BY 'password';缓存

新用户建立完成,可是此刻若是以此用户登录的话,会报错,由于咱们尚未为这个用户分配相应权限,分配权限的命令以下:服务器

1oracle

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';ide

授予username用户在全部数据库上的全部权限。wordpress

若是此时发现刚刚给的权限太大了,若是咱们只是想授予它在某个数据库上的权限,那么须要切换到root 用户撤销刚才的权限,从新受权:spa

1.net

2

EVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';

GRANT ALL PRIVILEGES ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

甚至还能够指定该用户只能执行 select 和 update 命令:

1

GRANT SELECT, UPDATE ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

这样一来,再次以username登录 MySQL,只有wordpress数据库是对其可见的,而且若是你只受权它select权限,那么它就不能执行delete 语句。

另外每当调整权限后,一般须要执行如下语句刷新权限:

1

FLUSH PRIVILEGES;

删除刚才建立的用户:

1

DROP USER username@localhost;

仔细上面几个命令,能够发现无论是受权,仍是撤销受权,都要指定响应的host(即 @ 符号后面的内容),由于以上及格命令实际上都是在操做mysql 数据库中的user表,能够用以下命令查看相应用户及对应的host:

1

SELECT User, Host FROM user;

MySQL Study之--MySQL用户及权限管理
MySQL服务器经过MySQL权限表来控制用户对数据库的访问,MySQL权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些MySQL权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
user权限表:记录容许链接到服务器的用户账号信息,里面的权限是全局级的。
db权限表:记录各个账号在各个数据库上的操做权限。
table_priv权限表:记录数据表级的操做权限。
columns_priv权限表:记录数据列级的操做权限。
host权限表:配合db权限表对给定主机上数据库级操做权限做更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

案例分析:
1、建立用户并受权(root用户)
[root@mysrv ~]# mysql -u root -poracle

mysql> select version()\g
+-------------------------------------------+
| version() |
+-------------------------------------------+
| 5.6.25-enterprise-commercial-advanced-log |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| prod |
| test |
+--------------------+
5 rows in set (0.01 sec)


一、创建tom用户并受权(特权管理用户)

mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;
Query OK, 0 rows affected (0.00 sec)

查看用户建立是否成功:
mysql> select user,host from user ;

1

2

3

4

5

6

7

8

9

10

11

12

13

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

8 rows in set (0.00 sec)

查看tom用户的受权:
mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+

GRANT 语法:
GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION

权限列表:
ALTER: 修改表和索引。
CREATE: 建立数据库和表。
DELETE: 删除表中已有的记录。
DROP: 抛弃(删除)数据库和表。
INDEX: 建立或抛弃索引。
INSERT: 向表中插入新行。
REFERENCE: 未用。
SELECT: 检索表中的记录。
UPDATE: 修改现存表记录。
FILE: 读或写服务器上的文件。
PROCESS: 查看服务器中执行的线程信息或杀死线程。
RELOAD: 重载受权表或清空日志、主机缓存或表缓存。
SHUTDOWN: 关闭服务器。
ALL: 全部权限,ALL PRIVILEGES同义词。
USAGE: 特殊的 "无权限" 权限。
用 户帐户包括 "username" 和 "host" 两部分,后者表示该用户被容许从何地接入。tom@'%' 表示任何地址,默承认以省略。还能够是 "tom@192.168.1.%"、"tom@%.abc.com" 等。数据库格式为 db@table,能够是 "test.*" 或 "*.*",前者表示 test 数据库的全部表,后者表示全部数据库的全部表。
子句 "WITH GRANT OPTION" 表示该用户能够为其余用户分配权限。 

二、咱们用 root 再建立几个用户,而后由 test 数据库的管理员tom为他们分配权限。

mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| tom1  | %         |

| tom2  | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

10 rows in set (0.00 sec)

root用户退出,tom登录,并受权用户访问prod库

[root@mysrv ~]# mysql -u tom -ptom 
ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)

tom用户竟不能登录!!!

再对tom用户受权:
mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> use mysql;
Database changed
mysql> select user,host from user ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| tom1  | %         |

| tom2  | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

| tom   | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

11 rows in set (0.00 sec)

tom登录:
[root@mysrv ~]# mysql -u tom -ptom prod
mysql> select database();
+------------+
| database() |
+------------+
| prod |
+------------+
1 row in set (0.01 sec)

mysql> select current_user(); +----------------+ | current_user() | +----------------+ | tom@localhost | +----------------+ 1 row in set (0.00 sec)

相关文章
相关标签/搜索