前言

今天继续MySQL系列文章,讲讲MySQL权限相关的内容。我们都知道,在写系统的时候,都会有权限相关的服务,以达到权限控制的目的。以最简单的权限菜单为例: 管理员拥有最大权限,可以查看系统下所有菜单。操作员只拥有部分菜单权限。同样的,在MySQL数据库中也有相应的权限管理。例如:数据库连接权限,新增,修改,查询权限等等。下面我们就一一揭晓MySQL权限的真实面貌。

授权方式

在讲 MySQL 权限之前,我们不得不先熟悉下MySQL中常见的两种授权方式。

姑且称为:授权法 和 改表法 吧。

1. 授权法

标准语法如下:

grant all on db_name.table_name to 'user_name'@'host_name';

其中:

  1. grant 为MySQL关键字。

  2. all 表示所有权限,也可以授予部分权限,如select,insert,update,create,drop等等。

  3. db_name 表示数据库名。其中:* 表示该数据库实例中的所有数据库。

  4. table_name 为db_name数据库中的表名。其中:* 表示db_name数据库中的所有表。

  5. user_name 表示数据库服务器中已经存在的用户名。

  6. host_name 表示允许连接的主机。(localhost / 127.0.0.1 表示本机,% 表示任何主机,也可以用域名表示。)

以设置root用户允许远程连接为例:

给 root 用户设置该实例上所有数据库的所有权限,且允许其通过任意主机连接该实例。则可以用下述语句表示:

grant all on *.* to 'root'@'%';

2. 改表法

你一定很好奇,MySQL是如何判断用户是否有某数据库的权限?是否有某表的权限?
其实呀,在MySQL中是有特定数据结构来存储这部分信息的。我们可以按照下述步骤来找到它,甚至可以来修改它,以达到修改权限的目的。

  1. 首先,我们登录到MySQL服务器。

  2. 进入MySQL服务器中自带的 mysql 数据库中。

  3. 找到 mysql 数据中的 user 表,修改对应用户的信息即可。

以设置root用户允许远程连接为例:

use mysql;

update user set host="%" where user="root";

flush privileges;

执行以上语句后,我们可以通过以下语检查是否生效:

show grants for 'root'@'%';

值得注意的是:

为了权限验证时的高效性。MySQL在服务启动时,就会将权限数据加载在内存中。因此,授权法 与 改表法 会有以下细微差异:

  1. 我们在使用 grant 命令时,即授权法。其会自动通知MySQL服务器重新加载一次权限数据。以达到即时生效的效果。

  2. 但当我们使用改表法时。是没有通知重新加载权限数据的。因此会导致其不会即时生效。直至服务重启后生效。服务重启,特别是生产环境,那几乎是灾难性的。好在MySQL为我们提供了手动通知的命令。即:flush privilege命令。

例如:

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

连接权限

通过上面的介绍,我们现在应该已经知道了MySQL中常见的授权方式。现在就从实际角度来用用。我们都知道在MySQL中默认是不允许root用户远程登录的。我们通过以下命令修改即可:

grant all on *.* to 'root'@'%';
  1. 如果想设置成通过指定的IP登录,则可以将 %替换成特定的IP即可。

  2. 如果想设置成通过指定的IP段登录,即可以将%替换成192.168.1.%即可。

(其中: 将192.168.1修改成你想要IP段即可!)

表权限

知道了连接权限,我们再来说说表权限。以几种常见的场景为例:

  1. 设置用户 andyqian 在 customer 数据库中的 t_user 表的所有权限。

    grant all on customer.t_user to 'andyqian'@'%';
  2. 设置用户 andyqian 在 customer 数据库中 t_user 表的只读权限。

    grant select on customer.t_user to 'andyqian'@'%';

    当仅仅只设置只读权限时,执行update命令会有如下错误信息:

    mysql> update t_user set name="sansan",updated_at=now() where oid=1;
    ERROR 1142 (42000): UPDATE command denied to user 'andyqian'@'localhost' for table 't_user
  3. 设置用户andyqian在 customer 数据库中 t_user 表的可读可写权限。

    grant select,insert,update on customer.t_user to 'andyqian'@'%';

    当仅仅只设置可读,可写,可修改权限时,执行drop命令会有如下错误信息:

    mysql> drop table t_user;
    ERROR 1142 (42000): DROP command denied to user 'andyqian'@'%' for table 't_user

    列权限

    在某些场景下,我们需要将权限精确到列上。我们也可以使用 grant命令来实现。

  4. 设置指定列的insert权限时:

    grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';
  5. ```
    mysql> insert into t_user(name,created_at,updated_at)values('name',now(),now());
    ERROR 1143 (42000): INSERT command denied to user 'andyqian'@'localhost' for column 'name' in table 't_user'

    撤销权限

    有添加权限,肯定也少不了撤销权限。其语法与grant基本一致。仅仅只是关键字不同

  6. 撤销 用户 andyqian 对 customer数据库中的t_user表 created_atupdated_at字段的新增权限。

    revoke insert(created_at,updated_at) on customer.t_user from 'andyqian'@'localhost';

查看用户权限

上面说到,如果用户执行没有权限的命令时。则会显示错误信息。为了避免这种情况发生。我们可以先通过以下命令来查看当前用户拥有的权限。

命令: show grants for 'user_name'@'localhost'

其可以使用current_user()函数来表示当前登录用户。

例如:

mysql> show grants for current_user();
+-----------------------------------------------------------------------+
| Grants for andyqian@localhost                                         |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'andyqian'@'localhost'                          |
| GRANT SELECT, INSERT ON `customer`.`t_user` TO 'andyqian'@'localhost' |
+-----------------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. 其中第一句: USAGE 表示没有特殊权限的意思。使用 show grants命令查看时,通常会一起显示在结果列表中。

  2. 第二句则表示用户 andyqian 在customer数据库中的t_user表中有select,insert 权限。

最后

有很多童鞋会觉得:数据库管理,SQL优化,索引建立等等,都是DBA的事情。开发人员不需要了解。我认为这种认知是错误的,数据库设计本身就是后端工程师工作职责的一部分。DBA 应该是设计的审核者,而不是建立者。

说说MySQL权限的更多相关文章

  1. MySQL 权限与安全

    一.MySQL权限系统通过两个阶段进行认证: (A) 对用户进行身份认证,IP地址和用户名联合, (B) 对合法用户赋予相应权限,权限表在数据库启动的时候载入内存中. 二.在权限的存取过程中,会用到& ...

  2. mysql权限管理

    经常遇到有网友在QQ群或者论坛上问关于mysql权限的问题,今天抽空总结一下关于这几年使用MYSQL的时候关于MYSQL数据库的权限管理的经验,也希望能对使用mysql的网友有所帮助! 一.MYSQL ...

  3. mysql权限与安全

    一.MySQL权限系统通过两个阶段进行认证: (A) 对用户进行身份认证,IP地址和用户名联合, (B) 对合法用户赋予相应权限,权限表在数据库启动的时候载入内存中. 二.在权限的存取过程中,会用到& ...

  4. MYSQL权限表user操作

        MYSQL权限表user cmd中进人mysql找到mysql安装目录     E:\wamp\bin\mysql\mysql5.6.12\bin>mysql.exe -u 用户名  - ...

  5. 【MySQL学习笔记】MySQL权限表

    MySQL权限表,控制用户对数据库的访问,存在mysql数据库中,由mysql_install_db初始化,包括user,db,host,tables_priv,columns_priv,procs_ ...

  6. mysql 权限控制

    1.mysql的权限是,从某处来的用户对某对象的权限. 2.mysql的权限采用白名单策略,指定用户能做什么,没有指定的都不能做. 3.权限校验分成两个步骤: a.能不能连接,检查从哪里来,用户名和密 ...

  7. Mysql权限控制 - 允许用户远程连接

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

  8. mysql权限及用户

    一:Flush table tables_name MySQL的FLUSH句法(清除或者重新加载内部缓存) FLUSH flush_option [,flush_option],如果你想要清除一些My ...

  9. mysql 权限管理

     参考:    http://www.cnblogs.com/Richardzhu/p/3318595.html 一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内 ...

  10. Mysql权限控制 - 允许用户远程连接(转载)

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

随机推荐

  1. DataTable记录

    DataTable dt2 = dt.Copy();//复制结构和数据 //复制结构,不要数据 DataTable dt2 = new DataTable(); for (int i = 0; i & ...

  2. 邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

    邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...

  3. URL Scheme

    [URL Scheme] 可以通过info.plist注册url types来实现程序自定义的协议,以供外部程序调起. NSURL *myURL = [NSURL URLWithString:@&qu ...

  4. MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

    第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...

  5. java并发编程实战:第八章----线程池的使用

    一.在任务和执行策略之间隐性耦合 Executor框架将任务的提交和它的执行策略解耦开来.虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略. 依 ...

  6. [转载]关于JAVA中子类和父类的构造方法

    原文链接:https://www.cnblogs.com/chenpi/p/5486096.html#_label0

  7. polymer技巧

    1.添加一个div元素 我们完全可以自己造一个这样的东西出来,比如下面例子我们给 div 元素添加一个 is="demo-test" <script> var Poly ...

  8. [label][转载][paypal]paypal在线支付接口的WEB语言设置

    http://stephen830.iteye.com/blog/274072 ★★★ 本篇为原创,需要引用转载的朋友请注明:< http://stephen830.iteye.com/blog ...

  9. 使用Docker部署ASP.NET Core应用程序实践

    前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docke ...

  10. Ubuntu 16.04.2 LTS 安装 jdk1.6 和 tomcat6 (一)

    java和tomcat环境配置已经有很多教程和文章,最近项目需要配置Ubuntu 16.04.2下的古老的java6和tomcat 6,遇到小坑,特记录和分享. 网上的教程不是太新,就是太老,还有一些 ...