MySQL Study之--MySQL用户及权限管理


    MySQLserver通过MySQL权限表来控制用户对数据库的訪问。MySQL权限表存放在mysql数据库里。由mysql_install_db脚本初始化。

这些MySQL权限表分别user,db,table_priv。columns_priv和host。以下分别介绍一下这些表的结构和内容:

user权限表:记录同意连接到server的用户帐号信息,里面的权限是全局级的。

db权限表:记录各个帐号在各个数据库上的操作权限。

table_priv权限表:记录数据表级的操作权限。

columns_priv权限表:记录数据列级的操作权限。

host权限表:配合db权限表对给定主机上数据库级操作权限作更仔细的控制。

这个权限表不受GRANT和REVOKE语句的影响。



案例分析:



一、创建用户并授权(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)





1、建立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 ;

+-------+-----------+
| 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: 读或写server上的文件。

PROCESS: 查看server中运行的线程信息或杀死线程。

RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

SHUTDOWN: 关闭server。

ALL: 全部权限。ALL PRIVILEGES同义词。

USAGE: 特殊的 "无权限" 权限。

用 户账户包含 "username" 和 "host" 两部分,后者表示该用户被同意从何地接入。

tom@'%' 表示不论什么地址,默认能够省略。还能够是 "tom@192.168.1.%"、"tom@%.abc.com" 等。数据库格式为 db@table,能够是 "test.*" 或 "*.*",前者表示 test 数据库的全部表,后者表示全部数据库的全部表。 

子句 "WITH GRANT OPTION" 表示该用户能够为其它用户分配权限。 





2、我们用 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 ;

+-------+-----------+
| 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 ;

+-------+-----------+
| 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)



创建表:



mysql> show tables;

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

| Tables_in_prod |

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

| t1             |

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

1 row in set (0.00 sec)



mysql> create table t2 as select * from t1;

Query OK, 3 rows affected (0.15 sec)

Records: 3  Duplicates: 0  Warnings: 0



查看表信息:



mysql> desc t2;


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

| Field | Type        | Null | Key | Default | Extra |

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

| id    | int(11)     | YES  |     | NULL    |       |

| name  | varchar(10) | YES  |     | NULL    |       |

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

2 rows in set (0.01 sec)



mysql> show create table t2;


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

| Table | Create Table                                                                                                              |

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

| t2    | CREATE TABLE `t2` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.01 sec)



mysql> show create table t2\G;

*************************** 1. row ***************************

       Table: t2

Create Table: CREATE TABLE `t2` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)



mysql> select * from t2;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

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

3 rows in set (0.00 sec)



3、tom用户为tom1,tom2授权

mysql> grant select on prod.* to tom1;

Query OK, 0 rows affected (0.00 sec)



mysql> grant select on prod.* to tom2;

Query OK, 0 rows affected (0.02 sec)



mysql> grant insert,update on prod.* to tom2;

Query OK, 0 rows affected (0.00 sec)



tom2登陆(从远程登陆):



C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2



mysql> select database();

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

| database() |

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

| NULL       |

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

1 row in set (0.00 sec)



mysql> use prod;

Database changed

mysql> select database();

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

| database() |

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

| prod       |

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

1 row in set (0.00 sec)



mysql> select current_user();

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

| current_user() |

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

| tom2@%         |

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

1 row in set (0.00 sec)



mysql> show grants for tom2;

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

| Grants for tom2@%                                                |

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

| GRANT USAGE ON *.* TO 'tom2'@'%' IDENTIFIED BY PASSWORD <secret> |

| GRANT SELECT, INSERT, UPDATE ON `prod`.* TO 'tom2'@'%'           |

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

2 rows in set (0.00 sec)



mysql> show tables;

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

| Tables_in_prod |

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

| t1             |

| t2             |

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

2 rows in set (0.00 sec)



mysql> select * from t1;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

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

3 rows in set (0.00 sec)



mysql> select * from t2;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

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

3 rows in set (0.00 sec)



mysql> insert into t1 values (40,'john');

Query OK, 1 row affected (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.09 sec)



mysql> select * from t1;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

|   40 | john  |

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

4 rows in set (0.00 sec)



mysql> update t1 set name='ellen' where id=40;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0



mysql> select * from t1;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

|   40 | ellen |

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

4 rows in set (0.00 sec)



mysql> delete from t1;

ERROR 1142 (42000): DELETE command denied to user 'tom2'@'192.168.8.254' for tab

le 't1'

mysql> commit;

Query OK, 0 rows affected (0.05 sec)



mysql> select * from t1;

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

| id   | name  |

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

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

|   40 | ellen |

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

4 rows in set (0.00 sec)





4、回收tom2的update权限:

mysql> revoke update on prod.* from tom2;

Query OK, 0 rows affected (0.00 sec)



tom2再又一次登陆:

C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2



mysql> use prod;

Database changed

mysql> update t1 set name='lily' where id=10;

ERROR 1142 (42000): UPDATE command denied to user 'tom2'@'192.168.8.254' for tab

le 't1'

---update失败!

二、改动用户口令:



1、root用户改动普通用户口令

mysql> set password for tom1=password('oracle');

Query OK, 0 rows affected (0.01 sec)



mysql> flush privileges;


Query OK, 0 rows affected (0.00 sec)



tom1又一次登陆:

C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1

Warning: Using a password on the command line interface can be insecure.

ERROR 1045 (28000): Access denied for user 'tom1'@'192.168.8.254' (using passwor

d: YES)

---旧口令登陆失败!



C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle

mysql>



2、普通用户改动自己password:

C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle

mysql> set password=password('tom1');

Query OK, 0 rows affected (0.00 sec)



又一次登陆:

C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1


mysql>

---新password登陆成功 !


三、删除用户:


1、回收用户全部权限

mysql> revoke all on prod.* from tom2;

Query OK, 0 rows affected (0.01 sec)



2、删除用户

mysql> drop user tom2;

Query OK, 0 rows affected (0.00 sec)



mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)



mysql> select user,host from user;

+-------+-----------+
| user | host |
+-------+-----------+
| jerry | % |
| rose | % |
| tom | % |
| tom1 | % |
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| jerry | localhost |
| root | localhost |
| rose | localhost |
| scott | localhost |
| tom | localhost |
| | mysrv |
| root | mysrv |
+-------+-----------+
14 rows in set (0.00 sec)

------- 摘要 -------------------------------------- 



创建用户:

GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

CREATE USER user2 IDENTIFIED BY 'password';

分配权限:

GRANT select ON testdb.* TO user2;

查看权限:

SHOW GRANTS FOR user1;

改动password:

SET PASSWORD FOR user1 = PASSWORD('newpwd');

SET PASSWORD = PASSWORD('newpwd');

移除权限:

REVOKE all ON *.* FROM user1; 

删除用户:

DROP USER user1;

数据库列表:

SHOW DATABASES;

数据表列表:

SHOW TABLES;

当前数据库:

SELECT DATABASE();

当前用户:

SELECT USER();

数据表结构:

DESCRIBE table1;

刷新权限:

FLUSH PRIVILEGES;



grant和revoke能够在几个层次上控制訪问权限

1,整个server,使用 grant ALL  和revoke  ALL

2,整个数据库。使用on  database.*

3。特点表,使用on  database.table

4,特定的列

5,特定的存储过程

 

user表中host列的值的意义

%              匹配全部主机

localhost    localhost不会被解析成IP地址,直接通过UNIXsocket连接

127.0.0.1      会通过TCP/IP协议连接,而且仅仅能在本机訪问;

::1                 ::1就是兼容支持ipv6的。表示同ipv4的127.0.0.1

 

grant 普通数据用户,查询、插入、更新、删除 数据库中全部表数据的权利。

grant select on testdb.* to common_user@’%’

grant insert on testdb.* to common_user@’%’

grant update on testdb.* to common_user@’%’

grant delete on testdb.* to common_user@’%’

或者,用一条 MySQL 命令来替代:

grant select, insert, update, delete on testdb.* to common_user@’%’

grant 数据库开发者,创建表、索引、视图、存储过程、函数。。。

等权限。

grant 创建、改动、删除 MySQL 数据表结构权限。

grant create on testdb.* to developer@’192.168.0.%’;

grant alter on testdb.* to developer@’192.168.0.%’;

grant drop on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 外键权限。

grant references on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 暂时表权限。



grant create temporary tables on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 索引权限。

grant index on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 视图、查看视图源码 权限。

grant create view on testdb.* to developer@’192.168.0.%’;

grant show view on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 存储过程、函数 权限。



grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status

grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure

grant execute on testdb.* to developer@’192.168.0.%’;

grant 普通 DBA 管理某个 MySQL 数据库的权限。

grant all privileges on testdb to dba@’localhost’

当中,keyword “privileges” 能够省略。

grant 高级 DBA 管理 MySQL 中全部数据库的权限。

grant all on *.* to dba@’localhost’


MySQL grant 权限,分别能够作用在多个层次上。

1. grant 作用在整个 MySQL server上:

grant select on *.* to dba@localhost; -- dba 能够查询 MySQL 中全部数据库中的表。

grant all on *.* to dba@localhost; -- dba 能够管理 MySQL 中的全部数据库

2. grant 作用在单个数据库上:

grant select on testdb.* to dba@localhost; -- dba 能够查询 testdb 中的表。

3. grant 作用在单个数据表上:

grant select, insert, update, delete on testdb.orders to dba@localhost;

4. grant 作用在表中的列上:

grant select(id, se, rank) on testdb.apache_log to dba@localhost;

5. grant 作用在存储过程、函数上:

grant execute on procedure testdb.pr_add to ’dba’@’localhost’

grant execute on function testdb.fn_add to ’dba’@’localhost’



注意:改动完权限以后 一定要刷新服务。或者重新启动服务。刷新服务用:FLUSH PRIVILEGES。






MySQL Study之--MySQL用户及权限管理的更多相关文章

  1. MySQL/MariaDB数据库的用户和权限管理

    MySQL/MariaDB数据库的用户和权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.元数据数据库(mysql) 系统授权表(均在mysql数据库中): db hos ...

  2. mysql 用户及权限管理 小结

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  3. MySQL用户与权限管理

    执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...

  4. mysql用户和权限管理

    用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...

  5. Mysql 用户,权限管理的几点理解。

    前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...

  6. Mysql 用户和权限管理

    用户和权限管理: 语法 grant 权限 on 数据库.数据表 to '用户' @ '主机名'; 例:给 xiaogang 分配所有的权限 grant all on *.* to 'xiaogang' ...

  7. MySQL数据库用户和权限管理

    一.视图 视图:VIEW,虚表,保存有实表的查询结果,在视图插入的内容都会存入表中.创建方法: CREATE VIEW view_name [(column_list)] AS select_st ...

  8. MySQL高级学习笔记(二):mysql配置文件、mysql的用户与权限管理、mysql的一些杂项配置

    文章目录 mysql配置文件 二进制日志log-bin 错误日志log-error 数据文件 两系统 Myisam存放方式 innodb存放方式 如何配置 mysql的用户与权限管理 MySQL的用户 ...

  9. MySQL基础篇(07):用户和权限管理,日志体系简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL用户 1.基础描述 在数据库的使用过程中,用户作为访问数据库的鉴权因素,起到非常重要的作用,安装MySQL时会自动生成一个roo ...

随机推荐

  1. IntelliJ IDEA集成工具Database连接MySQL8.0报错的解决方法

    直接用默认配置连接的话,会报以下错误: Connection to MySQL - @localhost failed. [08001] Could not create connection to ...

  2. 【C语言项目】贪吃蛇游戏(上)

    目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...

  3. 硬盘写入 iso

    https://www.jb51.net/softjc/508796.html WinImage 正确操作是要有两个or以上-硬盘. 这样才能写入你要装的操作系统 测试或者安装

  4. tmp note

    cat file.txt > /dev/null 2>&1 丢弃错误和标准输出 systemctl isolate multi-user.target 切换回多用户命令行模式 sy ...

  5. java读取nc文件的问题,前端ajax 发送参数进行交互的实例

    1.问题背景: 需要解析nc文件的数据源,获取一个三维数据,并计算器开发值. java 后台处理: 定以一个实例来接收解析的数据并返回给前端. package cn.edu.shou.domain; ...

  6. ssh服务使用介绍二

    老司机开车了 快上车 上文提到当我们使用ssh远程链接主机的时候,会出现询问的提示,如果我们链接的机器多了,一遍一遍的输入是不是很麻烦?怎么解决如下 vim /etc/ssh/ssh_config 如 ...

  7. python 闭包&装饰器(一)

    一.闭包 1.举例 def outer(): x = 10 def inner(): # 内部函数 print(x) # 外部函数的一个变量 return inner # 调用inner()函数的方法 ...

  8. Spring入门(1)——搭建简单的环境

    步骤: 1.下载spring框架开发包. 2.创建web项目并引入开发包. 3.创建java接口和相应的实现类. 4.编写spring的配置文件. 5.编写 测试类,并进行测试. 1.下载spring ...

  9. Struts2入门(1)——搭建简单的环境

    步骤: 1.下载Struts2的开发包. 2.创建Web项目. 3.导入需要的jar包到项目里. 4.在web.xml文件里面配置struts2的核心控制器,也就是一个过滤器. 5.编写Action类 ...

  10. python3--算法基础:二维数组转90度

    python3--算法基础:二维数组转90度 [0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3] 二维数组转90度 [0, 0, 0, 0][1, 1, ...