摘自:http://blog.chinaunix.net/uid-31401119-id-5781305.html

1  Flush tables简介

官方手册中关于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请求阻塞。

2  Flush tables影响

1)flush tables会等待正在运行的所有语句执行结束,即使运行的是查询请求;

2)如果flush tables等待SQL请求操作的表集合为{tables},这里的tables组合应该是当前正在有sql在运行的,已经打开的表,同一个库中,没有sql运行的表是不计算在内,因此 若 库star中有3张表,tx1和tx2被打开了,,的若有新请求操作{tables}中的任意一表,这些请求都会阻塞(即使是普通查询),如会话3;

3)如果其他会话新请求操作{tables}外的其他表,不会被阻塞,如会话4。

从此可知,flush tables操作可认为是{tables}所有表的表级排他锁,会阻塞其他会话关于{tables}表上的所有操作。假设一个大查询或长事务过程中(如会话1)执行flush tables操作,那么flush tables会等待长事务的结束(如会话1),同时阻塞关于{tables}的新请求。

3 Flush tables with read lock

Flush tables with read lock是另一个常见的操作,与Flush tables的作用是一样的,同样会等待所有正在运行的SQL请求结束,只是增加了一个全局读锁,即阻塞所有库所有表的写操作,直到unlock tables操作完成。

1)与flush tables一样,flush tables with read lock会等待正在运行的所有语句执行结束。

2)如果flush tables with read lock等待SQL请求操作的表集合为{tables},若有新请求操作{tables}中的任意一表,这些请求都会阻塞。

a)    如果是查询请求,在flush tables with read lock结束后就可执行。

b)    如果是插入、更新等写请求,必须等待unlock tables释放读锁。

3) 如果其他会话新请求操作{tables}外的其他表,则

a)    如果是查询请求,不会被阻塞。

b)    如果是写请求,必须等待unlock tables释放读锁

因此,flush tables with read lock操作是{tables}所有表的表级排他锁,同时是库级读锁,会阻塞库上所有写操作,直到执行unlock tables。其影响面比flush tables更大。也就是比flush tables多一点影响,阻塞了{tables}之外的表的写操作,不影响其读操作,只有unlock tables之后,释放了这个对库的全局读锁之后,才可以写。

4 一致性备份的问题

一般情况下,很少会主动使用flush tables和flush tables with read lock操作。更多使用这两个命令是mysqldump进行数据备份的时候。如果使用mysqldump进行一致性备份时,一般指定了--master-data和--single-transaction这两个参数,那么在备份操作执行前,先执行flush tables和flush tables with read lock这两个命令,以获得此一致性读的binlog位置。

获得binlog位置的过程为:

1)    flush tables操作是等待正在运行的所有操作结束;

2)    flush tables with read locks是为了加 库级全局读锁,禁止写操作;

3)    通过show master status获得此时binlog位置;

4)    unlock tables释放全局读锁,允许写请求。

先执行flush tables而不是直接执行flush tables with read locks的原因是,flush tables阻塞其他请求的可能性更少。假设flush tables的过程中出现大查询,从前面的分析知道,仅影响其他会话关于{tables}表的请求,而不像flush tables with read locks会阻塞所有写操作。

然而,以上操作只是大大减少了全局读锁的影响范围,如果在flush tables和flush tables with read locks之间出现大事务,还是有可能会出现所有写操作hang住的情况。因此,必须谨慎使用一致性备份的功能。

另外,经测试,如果出现flush tables阻塞其他会话的情况,如会话3、会话5的操作,是不会记录慢查询日志的,但事实上,应用程序可能是得不到迅速的响应了。

MySQL 清理缓存—flush tablesFlush tables的影响的更多相关文章

  1. mysql实战优化之九:MySQL查询缓存总结

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销. mysql ...

  2. 生产要不要开启MySQL查询缓存

    一.前言 在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议 ...

  3. MySQL查询缓存总结

    可以通过下面的SQL查看当前查询缓存相关参数状态: show variables like '%query_cache%'; 1)  query_cache_type 查询缓存类型: 0 表示始终不适 ...

  4. mysql系列三、mysql开启缓存、设置缓存大小、缓存过期机制

    一.开启缓存 mysql 开启查询缓存可以有两种方法来开启一种是使用set命令来进行开启,另一种是直接修改my.ini文件来直接设置都是非常的简单的哦. 开启缓存,设置缓存大小,具体实施如下: 1.修 ...

  5. Mysql查询缓存研究

    转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus). http://mp.weixin.qq.com/s?__biz=MzI ...

  6. mysql开启缓存、设置缓存大小、缓存过期机制

    目录 一.开启缓存 1.修改配置文件my.ini 2.命令方式 二.查看是否生效 1.query_cache_type 使用查询缓存的方式 2.have_query_cache 设置查询缓存是否可用 ...

  7. 【转】MySQL查询缓存详解

    [转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...

  8. MySQL查询缓存详解(总结)

    MySQL查询缓存详解(总结) 一.总结 一句话总结: mysql查询缓存还是可以用用试一试,但是更推荐分布式,比如redis/memcache之流,将数据库中查询的数据和查询语句以键值对的方式存进分 ...

  9. MySQL查询缓存

    MySQL查询缓存 用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会立即返回结果,省去解析.优化和执行等阶段. 如何检查缓存? MySQL保存结果于缓存中: 把SELECT语句本身做h ...

随机推荐

  1. 从0开始.NET CORE认证

    引子 最近在学习IdentityServer4,看了园子里大神们的文章,但是看完之后,能明白这样做可以达到业务需求.但是为什么这样做可以达到业务需求,我用其他方式不行吗?为什么这样做可以呢.也就是老话 ...

  2. [NLP自然语言处理]谷歌BERT模型深度解析

    我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...

  3. centos curl命令post携带body json数据

    1,接口链接 https://xxx.com/xqAppServer/api/APPBizRest/idfaDuplicateRemove/v1/?sysIdfa=661743D1-A76E-498A ...

  4. 选题Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8680 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐丽君 组名:组长 第 ...

  5. VC windows 多网卡情况下 获取当前网卡ip地址

    参考 代码如下 记录下以后用得到或者能帮到有需要的朋友 #include <iostream> #include <WinSock2.h> #include <Iphlp ...

  6. Windows Live Writer 语法高亮

    1.WindowsLiveWriter.CNBlogs.CodeHighlighter.rar 这个插件生成的高亮代码与网页上的一模一样,插入后即可立即显示效果,不过貌似它必须联网才能实时显示效果,因 ...

  7. Java中数组的使用

    1.声明数组 1.1声明一维数组 声明一维数组有下列两种格式: 数组的元素类型      数组名字[ ]; 数组的元素类型[ ]   数组名字 1.2声明二维数组 声明二维数组有下列两种格式: 数组的 ...

  8. VLC播放器的快捷键(shutcut)

    ubuntu上的视频播放器功能简陋,不支持快慢速,于是需要一款播放器来替代它,从网上找了找,大家对VLC的评价出奇的一致, 于是试水了一下,发现功能确实强大,支持大多数多媒体文件以及各类流媒体协议 在 ...

  9. [Micropython]TPYBoard v202 智能WIFI远控小车

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言---------------------- 之 ...

  10. RedisCluster linux下批量删除 key

    Redis Cluster linux下批量删除键 说明 使用时不支持传入参数 , 如 redis_batch_del.sh , 因为在linux下 会自动将 * 解析为当前目录下所有文件名, 目前还 ...