MySQL实战45讲
林晓斌
网名丁奇,前阿里资深技术专家
立即订阅
42990 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 这一次,让我们一起来搞懂MySQL
免费
基础篇 (8讲)
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
实践篇 (37讲)
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
特别放送 (1讲)
直播回顾 | 林晓斌:我的 MySQL 心路历程
结束语 (1讲)
结束语 | 点线网面,一起构建MySQL知识网络
MySQL实战45讲
登录|注册

42 | grant之后要跟着flush privileges吗?

林晓斌 2019-02-18
在 MySQL 里面,grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。
那么,grant 之后真的需要执行 flush privileges 吗?如果没有执行这个 flush 命令的话,赋权语句真的不能生效吗?
接下来,我就先和你介绍一下 grant 语句和 flush privileges 语句分别做了什么事情,然后再一起来分析这个问题。
为了便于说明,我先创建一个用户:
create user 'ua'@'%' identified by 'pa';
这条语句的逻辑是创建一个用户’ua’@’%’,密码是 pa。注意,在 MySQL 里面,用户名 (user)+ 地址 (host) 才表示一个用户,因此 ua@ip1 和 ua@ip2 代表的是两个不同的用户。
这条命令做了两个动作:
磁盘上,往 mysql.user 表里插入一行,由于没有指定权限,所以这行数据上所有表示权限的字段的值都是 N;
内存里,往数组 acl_users 里插入一个 acl_user 对象,这个对象的 access 字段值为 0。
图 1 就是这个时刻用户 ua 在 user 表中的状态。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《MySQL实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • way
    写个比较小的点:在命令行查询数据需要行转列的时候习惯加个\G ; 比如slave slave stauts \G ; 后来发现 ; 是多余的。列几个常用的
    \G 行转列并发送给 mysql server
    \g 等同于 ;
    \! 执行系统命令
    \q exit
    \c 清除当前SQL(不执行)
    \s mysql status 信息
    其他参考 \h

    作者回复: 👍

    我最开始使用MySQL的时候,就是不自然的在\G后面加分号
    而且还看到报错,好紧张😆

    2019-02-20
    1
    11
  • undifined
    权限的作用范围和修改策略总结:
    http://ww1.sinaimg.cn/large/d1885ed1ly1g0ab2twmjaj21gs0js78u.jpg

    作者回复: 👍,优秀

    2019-02-18
    1
    11
  • 夜空中最亮的星(华仔)
    通过老师的讲解 flush privileges 这回彻底懂了,高兴😃

    作者回复: 👍

    2019-02-18
    5
  • 发芽的紫菜
    老师,联合索引的数据结构是怎么样的?到底是怎么存的?看了前面索引两章,还是不太懂,留言里老师说会在后面章节会讲到,但我也没看到,所以来此问一下?老师能否画图讲解一下

    作者回复: 联合索引就是两个字段拼起来作索引

    比如一个索引如果定义为(f1,f2),
    在数据上,就是f1的值之后跟着f2的值。
    查找的时候,比如执行 where f1=M and f2=N, 也是把M,N拼起来,去索引树查找

    2019-02-18
    5
  • 业余草
    从学习中来,到实战中去!做了一个总结,可能写的不对,希望老师指点。https://mp.weixin.qq.com/s/7KGQGpm0IGaVjco6UjLeAQ

    作者回复: 认真看了这篇文章,我有点疑惑哦

    “这招够狠。重启在程序员届的杀招被他接上了。但是,重启失灵了,重启后,已有的连接还是没权限。具体的表现是,备库上的复制连接还是未权限。”
    主库重启的话,备库的连接也是重新创建的

    如果“重启无效”而“kill连接有效”,那不太合理哦

    2019-06-27
    3
  • 旭东
    老师请教一个问题:MySQL 表设计时列表顺序对MySQL性能的影响大吗?对表的列顺序有什么建议吗?

    作者回复: 没有影响

    建议就是每次如果要加列都加到最后一列😆

    2019-02-18
    3
  • Leon📷
    老师我使用delte删除用户,再创建用户都是失败,但是使用drop就可以了
    mysql> create user 'ua'@'%' identified by 'L1234567890c-';
    ERROR 1396 (HY000): Operation CREATE USER failed for 'ua'@'%'
    mysql> drop user 'ua'@'%';
    Query OK, 0 rows affected (0.00 sec)

    mysql> create user 'ua'@'%' identified by 'L1234567890c-';
    Query OK, 0 rows affected (0.01 sec)
    是不是drop才会同时从内存和磁盘删除用户信息,但是delete只是从磁盘删除

    作者回复: 对,drop是同时操作磁盘和内存,
    delete就是我们说的不规范操作

    2019-02-18
    3
  • XD
    老师,我刚说的是acl_db,是在db切换的时候,从acl_dbs拷贝到线程内部的?类似acl_user。

    session a
    drop user 'test'@'%';
    create user 'test'@'%' identified by '123456';
    grant SELECT,UPDATE on gt.* to 'test'@'%';

    session b 使用test登录
    use gt;

    session a
    revoke SELECT,UPDATE on gt.* from 'test'@'%';

    session b
    show databases; //只能看到information_schema库
    use gt; // Access denied for user 'test'@'%' to database 'gt'
    show tables; //可以看到gt库中所有的表
    select/update //操作都正常

    作者回复: 你说的对,我刚翻代码确认了下,确实是特别对“当前db”有一个放过的逻辑。

    多谢指正。我勘误下。

    2019-02-18
    2
  • 夹心面包
    我在此分享一个授权库的小技巧, 如果需要授权多个库,库名还有规律,比如 db_201701 db_201702
    可以采用正则匹配写一条 grant on db______,每一个_代表一个字符.这样避免了多次授权,简化了过程。我们线上已经采用

    作者回复: 是的,MySQL还支持 % 赋权,%表示匹配任意字符串,
    比如
    grant all privileges on `db%`.* to ... 表示所有以db为前缀的库。

    不过。。。我比较不建议这么用😅

    2019-02-18
    2
  • godtrue
    这篇容易消化,老师辛苦,你不讲这个,我想我很难发现这个细节,业务开发增删改查用的多,其他命令平时不咋用。
    多玩才能发现更多好玩的,如果能有几个老师这样的朋友一起玩,那该有多好玩。

    作者回复: 👍

    2019-08-09
    1
  • 虢国技匠
    老师的文章信息量(密度)很大,一般情况下得读好几遍,甚至读到头大;本篇是少有的几篇一口气读完能理解的,不容易啊 😂
    2019-07-18
    1
  • 冰点18
    两三个月的时间,终于在上班地铁上读完了整部专栏,老师辛苦了!接下来就是搭建环境,二刷和验证了!一直有个问题,想问下老师,您用的画图工具是哪个?风格我特别喜欢,但是没找到

    作者回复: ipad 上的pencil ,是编辑小姐姐画的哈,我画的是矩形的图😅

    2019-04-10
    1
  • 萤火虫
    坚持到最后 为老师打call

    作者回复: 👍
    是真爱

    2019-02-20
    1
  • 老师,介绍完了order by后能不能继续介绍下group by的原理?等了好久了,一直想继续在order by基础上理解下group by,在使用过程中两者在索引利用上很相近,性能考虑也类似

    作者回复: 37篇讲了group by的,你看下

    还有问再提出来😆

    2019-02-19
    1
  • Sinyo
    查一张大表,order_key字段值对应的最小createtime;
    以前一直用方法一查数,后来同事说可以优化成方法二,查询效率比方法一高了几倍;
    mysql特有的group by功能,没有group by的字段默认取查到的第一条记录;

    方法一:
    select distinct order_key
          ,createtime
      from (select order_key
                  ,min(createtime) createtime
              from aaa
             group by order_key) a
      join aaa b
        on a.order_key = b.order_key
       and a.createtime = b.createtime

    方法二:
    select order_key
          ,createtime
      from (select order_key
                  ,createtime
              FROM aaa
             order by createtime
           ) a
     group by order_key

    作者回复: 👍


    这第二个写法跟:
    select order_key ,createtime FROM aaa force index(createtime) group by order_key
     的逻辑语义相同吗?

    2019-02-18
    1
  • AlphaLiu
    在生产库进行全量备份:
    mysqldump -uroot -p654321 --all-databases > alldatabases.sql
    在本地库恢复:
    mysql -uroot -p123456 < alldatabases.sql
    恢复后,还是能使用mysql -uroot -p123456登录,
    而mysql -uroot -p654321,不能登录。
    必须flush privileges或者systemctl restart mysqld.service后,
    恢复后的root密码才能生效。
    请教下老师,这是什么原因?
    2019-11-06
  • 竹篮打水
    全局权限、对于一个已经存在的连接,它的全局权限不受 grant 命令的影响。那如果我要更新已建立连接的权限、怎么办、难道必须重新建立连接才能生效吗?
    2019-07-10
  • William
    从文中了解到, flush privileges 实际上就是保证磁盘与内存的数据一致性.
    如果一致,那么无需执行(执行了也没关系, 但是属于画蛇添足),
    但是不一致, 就需要执行..


    全局的权限修改, 不影响当前已有线程, 新线程建立采用新的权限.
    而对于db 表 列 的 权限 操作, 实时生效.
    2019-07-10
  • wljs
    老师我想问个问题 我们公司一个订单表有110个字段 想拆分成两个表 第一个表放经常查的字段 第二个表放不常查的 现在程序端不想改sql,数据库端来实现 当查询字段中 第一个表不存在 就去关联第二个表查出数据 db能实现不?
    2019-02-19
  • XD
    老师,实际测试了下。
    两个会话ab,登陆账号都为user。a中给user授予db1的select、update权限,b切换到db1,可以正常增改。然后a中回收该用户的db权限,b会话中的用户还是可以进行增改操作的。
    我发现用户的db权限好像是在切换数据库的时候刷新的,只要不切换,grant操作并不会产生作用,所以acl_db是否也是维护在线程内部的呢?

    以及,权限检验应该是在优化器的语义分析里进行的吧?

    作者回复: acl_dbs是全局数组

    把你使用sql语句,和语句序列发一下哦

    类似按照时间顺序
    session a:
      xxx
      xxx
    session b:
       xxxx
    session a:
       xxxx
    这样

    2019-02-18
收起评论
22
返回
顶部