这是mysql系列第3篇文章。

环境:mysql5.7.25,cmd命令中进行演示。

在玩mysql的过程中,经常遇到有很多朋友在云上面玩mysql的时候,说我创建了一个用户为什么不能登录?为什么没有权限?等等各种问题,本文看完之后,这些都不是问题了。

本文主要内容

  1. 介绍Mysql权限工作原理
  2. 查看所有用户
  3. 创建用户
  4. 修改密码
  5. 给用户授权
  6. 查看用户权限
  7. 撤销用户权限
  8. 删除用户
  9. 授权原则说明
  10. 总结

Mysql权限工作原理

mysql是如何来识别一个用户的呢?

mysql为了安全性考虑,采用主机名+用户名来判断一个用户的身份,因为在互联网中很难通过用户名来判断一个用户的身份,但是我们可以通过ip或者主机名判断一台机器,某个用户通过这个机器过来的,我们可以识别为一个用户,所以mysql中采用用户名+主机名来识别用户的身份。当一个用户对mysql发送指令的时候,mysql就是通过用户名和来源(主机)来断定用户的权限。

Mysql权限验证分为2个阶段:

  1. 阶段1:连接数据库,此时mysql会根据你的用户名及你的来源(ip或者主机名称)判断是否有权限连接
  2. 阶段2:对mysql服务器发起请求操作,如create table、select、delete、update、create index等操作,此时mysql会判断你是否有权限操作这些指令

权限生效时间

用户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时生效,所以如果通过直接操作这些表来修改用户及权限信息的,需要重启mysql或者执行flush privileges;才可以生效。

用户登录之后,mysql会和当前用户之间创建一个连接,此时用户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地方修改了当前用户的权限,这些变更的权限会在下一次登录时才会生效。

查看mysql中所有用户

用户信息在mysql.user表中,如下:

mysql> use mysql;
Database changed
mysql> select user,host from user;
+---------------+--------------+
| user | host |
+---------------+--------------+
| test4 | 127.0.0.% |
| test4 | 192.168.11.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| test2 | localhost |
+---------------+--------------+
6 rows in set (0.00 sec)

创建用户

语法:

create user 用户名[@主机名] [identified by '密码'];

说明:

  1. 主机名默认值为%,表示这个用户可以从任何主机连接mysql服务器
  2. 密码可以省略,表示无密码登录

示例1:不指定主机名

不指定主机名时,表示这个用户可以从任何主机连接mysql服务器

mysql> use mysql;
Database changed mysql> select user,host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
3 rows in set (0.00 sec) mysql> create user test1;
Query OK, 0 rows affected (0.00 sec) mysql> select user,host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| test1 | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
4 rows in set (0.00 sec) mysql> exit
Bye C:\Users\Think>mysql -utest1
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.7.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, 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.

上面创建了用户名为test1无密码的用户,没有指定主机,可以看出host的默认值为%,表示test1可以从任何机器登录到mysql中。

用户创建之后可以在mysql库中通过 select user,host from user;查看到。

其他示例

create user 'test2'@'localhost' identified by '123';

说明:test2的主机为localhost表示本机,此用户只能登陆本机的mysql

create user 'test3'@% identified by '123';

说明:test3可以从任何机器连接到mysql服务器

create user 'test4'@'192.168.11.%' identified by '123';

说明:test4可以从192.168.11段的机器连接mysql

修改密码【3种方式】

方式1:通过管理员修改密码

SET PASSWORD FOR '用户名'@'主机' = PASSWORD('密码');

方式2:create user 用户名[@主机名] [identified by '密码'];

set password = password('密码');

方式3:通过修改mysql.user表修改密码

use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;

注意:

通过表的方式修改之后,需要执行flush privileges;才能对用户生效。

5.7中user表中的authentication_string字段表示密码,老的一些版本中密码字段是password。

给用户授权

创建用户之后,需要给用户授权,才有意义。

语法:

grant privileges ON database.table TO 'username'[@'host'] [with grant option]

grant命令说明:

  • priveleges (权限列表),可以是all,表示所有权限,也可以是select、update等权限,多个权限之间用逗号分开。
  • ON 用来指定权限针对哪些库和表,格式为数据库.表名 ,点号前面用来指定数据库名,点号后面用来指定表名,*.* 表示所有数据库所有表。
  • TO 表示将权限赋予某个用户, 格式为username@host,@前面为用户名,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。
  • WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。

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

示例:

grant all on *.* to 'test1'@‘%’;

说明:给test1授权可以操作所有库所有权限,相当于dba

grant select on seata.* to 'test1'@'%';

说明:test1可以对seata库中所有的表执行select

grant select,update on seata.* to 'test1'@'%';

说明:test1可以对seata库中所有的表执行select、update

grant select(user,host) on mysql.user to 'test1'@'localhost';

说明:test1用户只能查询mysql.user表的user,host字段

查看用户有哪些权限

show grants for '用户名'[@'主机']

主机可以省略,默认值为%,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

show grants;

查看当前用户的权限,如:

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `test`.* TO 'root'@'localhost' |
| GRANT DELETE ON `seata`.* TO 'root'@'localhost' |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
4 rows in set (0.00 sec)

撤销用户的权限

语法

revoke privileges ON database.table FROM '用户名'[@'主机'];

可以先通过show grants命令查询一下用户对于的权限,然后使用revoke命令撤销用户对应的权限,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec) mysql> revoke select(host) on mysql.user from test1@localhost;
Query OK, 0 rows affected (0.00 sec) mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------+
| Grants for test1@localhost |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

上面我们先通过grants命令查看test1的权限,然后调用revoke命令撤销对mysql.userhost字段的查询权限,最后又通过grants命令查看了test1的权限,和预期结果一致。

删除用户【2种方式】

方式1:

drop user '用户名'[@‘主机’],示例:

mysql> drop user test1@localhost;
Query OK, 0 rows affected (0.00 sec)

drop的方式删除用户之后,用户下次登录就会起效。

方式2:

通过删除mysql.user表数据的方式删除,如下:

delete from user where user='用户名' and host='主机';
flush privileges;

注意通过表的方式删除的,需要调用flush privileges;刷新权限信息(权限启动的时候在内存中保存着,通过表的方式修改之后需要刷新一下)。

授权原则说明

  • 只授予能满足需要的最小权限,防止用户干坏事,比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限
  • 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段
  • 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码
  • 为每个用户设置满足密码复杂度的密码
  • 定期清理不需要的用户,回收权限或者删除用户

总结

  1. 通过命令的方式操作用户和权限不需要刷新,下次登录自动生效
  2. 通过操作mysql库中表的方式修改、用户信息,需要调用flush privileges;刷新一下,下次登录自动生效
  3. mysql识别用户身份的方式是:用户名+主机
  4. 本文中讲到的一些指令中带主机的,主机都可以省略,默认值为%,表示所有机器
  5. mysql中用户和权限的信息在库名为mysql的库中

Mysql系列目录

  1. 第1天:mysql基础知识
  2. 第2天:详解mysql数据类型(重点)

mysql系列大概有20多篇,喜欢的请关注一下!

Mysql系列 - 第3天:管理员必备技能(必须掌握)的更多相关文章

  1. SQL Server管理员必备技能之性能优化

    SQL Server管理员必备技能之性能优化 高文龙关注1人评论1171人阅读2017-09-22 08:27:41 SQL Server 作为企业必不可少的服务之一,所以对于管理员的日常运维是一个极 ...

  2. java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

    这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...

  3. java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能

    这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...

  4. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  5. 详解linux运维工程师入门级必备技能

    详解linux运维工程师入门级必备技能 | 浏览:659 | 更新:2013-12-24 23:23 | 标签:linux it自动化运维就是要很方便的运用各种工具进行管理维护,有效的实施服务器保护 ...

  6. Android高工必备技能

    转载:http://www.jianshu.com/p/d791bbede02c Step 1. 玩转RxJava 使用RxJava处理异步极其方便,各种操作符可以对数据做流水线式操作,再加上与Ret ...

  7. MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战

    本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...

  8. 高级Linux运维工程师必备技能(扫盲篇)

    高级Linux运维工程师必备技能(扫盲篇) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在了解文件系统之前,我们要学习一下磁盘存储数据的方式,大家都知道文件从内存若要持久化存储的 ...

  9. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

随机推荐

  1. TestNG独立运行的几种方法.md

    目录 通过main函数调用testng.xml文件,然后打成可执行jar包执行 1 假设我们已经写好了testng.xml,现在我们需要写一个主类和main函数用来调用testng.xml 2 把项目 ...

  2. RFC 2544 性能测试

    什么是RFC 2544?网络设备性能测试的一组指标,包括吞吐率.时延.丢包率.背靠背. * * * 吞吐率(Throughput). 定义:被测设备在不丢包的情况下,所能转发的最大数据流量.通常使用每 ...

  3. 归并排序(从上到下、从下到上)——C语言

    归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归 ...

  4. docker挂载volume的用户权限问题,理解docker容器的uid

    docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题. 这里通过遇到的问题来理解docker容器用户 ...

  5. Java动态,安全追踪工具

    Java动态,安全追踪工具 在我们日常的开发中,总是难以避免的要解决线上的问题.如果线上的问题我们在本地调试的时候无论调试多少次发现明明本地调用了这个方法呀,怎么线上就是没调呢?还有就是出了问题的时候 ...

  6. .net core 实现基于 cron 表达式的任务调度

    .net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...

  7. 夯实Java基础(十二)——异常处理

    1.异常处理概述 在Java程序执行过程中, 总是会发生不被期望的事件, 阻止程序按照程序员预期正常运行, 这就是Java程序出现的异常. 异常处理是基于面向对象的一种运行错误处理机制,通过对异常问题 ...

  8. 启动Eclipse提示找不到虚拟机

    由于硬盘坏了,把所有东西都清光了,今天重新安装Eclipse,出现了一点小插曲 安装的时候出现了这个画面,以前安装也是照着[软件安装管家]的发布装的,幸好还懂得几个英文单词,看了一下提示信息,直译:[ ...

  9. Linux系统上安装OpenOffice

    项目需求需要在linux上安装openOffice,本以为很简单,现在看来还是入了很多坑.理清楚就好了. 官网地址 http://download.openoffice.org/other.html ...

  10. https理论及实践

    什么是https协议? http协议以明文的方式在网络中传输,安全性难以保证,https在http协议的基础上加入SSL/TLS层.TLS是SSL协议的最新版本,SSL使用SSL数字证书在通信两端建立 ...