官方手册中关于Flush tables的介绍, Closes all open tables, forces all tables in use to be closed, and flushes the query cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement.其解析就是关闭所有已打开的表对象,同时将查询缓存中的结果清空。就是说Flush tables的一个效果就是会等待所有正在运行的SQL请求结束。

因为,SQL语句在执行前,都会打开相应的表对象,如select * from t1语句,会找到t1表的frm文件,并打开表内存对象。为了控制表对象使用的内存空间和其他资源,MySQL会隐式(后台表对象管理线程)或显式(flush tables等)来关闭已打开但并没有使用的表对象。

然而,正在使用的表对象是不能关闭的(如SQL请求仍在运行),因此,Flush Tables操作会被正在运行的SQL请求阻塞。

注意这里是清空query cache,这个查询缓存基本不会在生产中应用,所以清空不清空的都影响,总之flush就是将现有数据库连接全部关闭,那么它可以立即关闭现有的连接吗? 答案当然是否定的,比如有些连接在插入数据 更新数据 甚至正在查询数据,这些都是不能立即关闭的,它要等人家完成后才能关闭人家的连接,也就是它需要等待的。我们来看下flush table等待情况

1.准备表a 和 表 b 并各自插入数据
CREATE TABLE `a` (`id` int(11) NOT NULL,PRIMARY KEY (`id`)
);
CREATE TABLE `b` (`id` int(11) NOT NULL,PRIMARY KEY (`id`)
) ;
insert into a values(1);
insert into b values(1);
2.进程1select  sleep(20)   from a limit 1 ;  执行中进程2:flush tables; 被阻塞(被进程1阻塞)进程3:select * from a;  被阻塞(被进程2阻塞)进程4:select * from b;执行完成insert into b values(3); 执行完成

结论:flush tables 是会被当前正在运行的sql阻塞的,但是 flush tables 还是会把阻塞它的表(无论多少个)都给锁定起来,这个时候这些表就不会在被其他进程使用,哪怕是select 也不行,而其他表则是还可以进行查询的。甚至其他表还可以被插入或修改,因此这里我们要清楚 flush tables 是只会将它执行的那个时间点之前的连接来关闭,执行完flush tables之后哪怕它正在被阻塞中,之后的那些连接照样可以进行其他操作,如果我们把进程4改成 insert操作也是可以正常执行

那么我们在做主从设置时候需要主从在某个日志点备份一致该怎么是实现呢,那就是flush tables 之后不刚锁定正在阻塞该指令的表,其他表也要一并锁定起来,只运行查询操作,注入更新或插入都是不允许的,这里我们就要用到了flush tables with read lock

FLUSH TABLES WITH READ LOCK

该操作是在flush tables 之后使用一个全局锁,将所有表都进行锁定,只允许查询

我们来进行下测试

.进程1select  sleep(20)   from a limit 1 ;  执行中进程2:flush tables with read lock; 被阻塞(被进程1阻塞)进程3:select * from a;  被阻塞(被进程2阻塞)进程4:select * from b;执行完成insert into b values(3); 执行被阻塞(被进程2阻塞)

我们看到进程4中查询是额可以正常执行的,但是插入被阻塞了,哪怕是当进程1执行完成后,进程2也提交后,数据库中的所有表还是只能查询,而不能进行dml的操作,这样就保证数据库目前的pid稳定不会变化

注意如果要解除全局锁要显式的解除锁定

unlock tables;

另外flush tables with read lock 可以锁定单独表的

flush tables a with read lock;

当然解锁的话也是 unlock tables;

mysql中flush tables和flush tables with read lock详解相关推荐

  1. mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  2. mysql中锁原理及for update悲观锁的详解

    mysql 中有多种多样的锁,今天我们具体分享一下: 一.mysql中乐观锁和悲观锁原理及种类: ​        乐观锁并不是数据库自带的,如果需要使用乐观锁,那么需要自己去实现,一般情况下,我们会 ...

  3. mysql中设置字符集语句_MYSQL字符集设置的方法详解(终端的字符集)

    前言 每次利用终端 创建数据库或者创建表的时候,字符集都是latin1,或者进行插入值的时候,显示的是乱码(不指定字符集的时候)如下: 查看当前数据库的字符集 character_set_client ...

  4. mysql5.7.11 linux_CentOS 7 中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本教程详解...

    MySQL 目前的最新版本是 5.7.11,在 Linux 下提供特定发行版安装包(如 .rpm)以及二进制通用版安装包(.tar.gz).一般情况下,很多项目都倾向于采用二进制通用安装包形式来进行安 ...

  5. python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...

  6. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  7. linux中etc下的hosts(本地IP解析)文件详解

    linux中etc下的hosts(本地IP解析)文件详解 1./etc/hosts(本地解析) 很多人一提到更改hostname首先就想到修改/etc/hosts文件, 认为hostname的配置文件 ...

  8. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  9. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  10. python中文意思k-对python中的*args与**kwgs的含义与作用详解

    在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kw是关键字参数 例如下面的代码 def fo ...

最新文章

  1. python安装的模块在pycharm中能用吗_pycharm内无法import已安装的模块问题解决
  2. Java设计模式(一) -- 工厂方法模式
  3. Python中通过PyPDF2实现PDF合并
  4. PHP 如何阻止用户上传成人照片或者裸照
  5. 利用有序节点来实现分布式锁
  6. 蚂蚁算法求解tsp问题matlab,蚁群算法解决TSP问题的MATLAB程序
  7. 话说Svn与Git的区别
  8. avalon框架,简单的MVVM
  9. matlab 微秒 符号,matlab处理csi
  10. IDE Eclipse / Visual Studio / CodeBlocks 调试命令 step into / step over / step return 功能
  11. 一个init.php(网站启始)的一般信息
  12. CentOS下通过yum安装svn及配置
  13. How to use Emerge
  14. C#断点续传HTTP下载远程文件的方法
  15. 人工智能AI-模型训练思路
  16. 百度迁徙大数据整理(2019-2020)
  17. 51单片机WIFI模块ESP8266-01s一定要看这个!普中科技给的模块 避免采坑!+CWJAP:3 FAIL 配置不了wifi名称和密码?
  18. ant nutch mysql_ant编译apache-nutch-2.2.1结合mysql实现爬虫的安装配置全过程
  19. 3.2nbsp;系统分析之正反馈
  20. 关于先有鸡蛋还是先有鸡的理解

热门文章

  1. NameValuePair和BasicNameValuePair的关系
  2. MATLAB的rename命令应用,rename命令怎么使用
  3. AirPods Pro 2出现随机断连问题,充电仓支持Find My成最大亮点
  4. 大数据毕设选题 - 深度学习股票预测系统(python Django)
  5. 33 Qt 之绘图之绘制卡通蚂蚁
  6. 计算机音乐凉凉6,凉凉(伴奏) MIDI File Download :: MidiShow
  7. YOLOV5训练自己的数据集(踩坑经验之谈)
  8. Android 11.0 支持exfat格式
  9. UNION 和 UNION ALL的区别
  10. 疯狂涨知识!拥有百万粉丝的大牛讲述学Android的历程,挥泪整理面经