FLUSH TABLES WITH READ LOCK 获取锁的速度
最近有一台MySQL的从库老是报延迟,观察到:FLUSH TABLES WITH READ LOCK,阻塞了4个多小时,还有另外一条SQL语句select *,从现象上来看是select * 阻塞了flush tables with read lock。
flush tables with read lock在测试的时候,它有可能花几毫秒就可以完成,就像我遇到的情况,在生产环境也可能花几个小时才能完成。在此期间,MySQL服务完全block住了,而不仅仅是read-only。因为flush tables with read lock会做一下动作:
1. 请求锁
flush tables with read lock请求全局read lock。当这种情况发生时,其他进程如果有修改动作的话就会被阻塞。从理论上讲,这种情况并不是很糟糕,因为flush tables with read lock只需要read lock,其它命令(只需要read lock的命令)可以和flush tables with read lock并存。然而,事实上,大多数表需要读和写锁的。例如:第一个写语句会被这个全局的读锁阻塞,而子查询又会被第一个写语句阻塞,所以真正有效果的是使用的是排它锁,所有新请求就会被阻塞,包括读查询语句。
2. 等待锁
在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables with read lock就会被阻塞,直到所有的锁被释放。例子如下:
mysql> show processlist;
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
| 4 | root | localhost | test | Query | 80 | Sending data | select count(*) from t t1 join t t2 join t t3 join t t4 where t1.b=0 |
| 5 | root | localhost | test | Query | 62 | Flushing tables | flush tables with read lock |
| 6 | root | localhost | test | Field List | 35 | Waiting for table | |
| 7 | root | localhost | test | Query | 0 | NULL | show processlist |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
4 rows in set (0.00 sec)
可以看到线程6没有连进来,因为MySQL的客户端连接时没有指定-A,它尝试获取当前库下的所有的表和列。线程5也没有flush tables,因为它在等线程4释放锁。
3. 刷新表
当flush tables with read lock拿到锁后,必定flush data。对于MyISAM引擎,不光是刷新它自己的data,也刷新操作系统的data到disk上(MyISAM relies on the filesystem block cache for caching reads to the data rows and indexes, while InnoDB does this within the engine itself, combining the row caches with the index caches),所以如果是MyISAM表的话有可能会花费很长时间。
4. 持有锁
我们可以使用unlock tables或者其它命令来释放锁。
结论
一个备份系统一般都是在生产环境中用的,所以我们不能简单的认为flush tables with read lock很快就执行完。在某些情况下,执行慢是没法避免的。但是我们可以配置备份系统避免这种global lock。
FLUSH TABLES WITH READ LOCK 获取锁的速度的更多相关文章
- FLUSH TABLES WITH READ LOCK 锁全局
[root@wx03 ~]# cat a3.sh mysql -uroot -p1234567<<eof use scan; FLUSH TABLES WITH READ LOCK; sy ...
- mysqldump中使用flush tables with read lock的风险分析
http://blog.csdn.net/wireless_tech/article/details/7332906 我们使用mysqldump --single-transaction -- ...
- FLUSH TABLES WITH READ LOCK
最近在mysql主从复制中用到锁,翻了资料回忆一下.一下内容参考于:http://blog.csdn.net/arkblue/article/details/27376991 1.FLUSH TABL ...
- MySQL flush tables with read lock
mysql> flush tables with read lock; flush tables with read lock 会去关闭已经打开的所有文件,它要做这个操作就先要拿到锁:当发起这个 ...
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行.解 ...
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES 之种种
1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行. ...
- Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
原文:Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析 一.RedissonLock#lock 源码分析 1.根据锁key计算出 slot,一个slot对 ...
- FLUSH TABLE WITH READ LOCK详解
FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关 ...
- Innodb加载数据字典 && flush tables
测试了两个case,属于之前blog的遗留问题: innodb如何加载数据字典 flush tables都做了什么操作 先来看下innodb加载数据字典: 首次使用:select * from tt; ...
随机推荐
- MySQL知识点系统总结
MySQL数据库是一个非常流行的关系型数据库.配合Linux.PHP.Apache,简称lamp,是一般个人企业网站的首选.MySQL用起来不难,要系统的用好,可不是一件简单的事.于是PHP程序员雷雪 ...
- C# WindowService 安装和卸载
安装脚本 install.bat 内容 @echo 安装WindowService%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\installutil ...
- 【AMAD】django-oauth-toolkit -- 为Django集成Oauth2加入一些好货!
简介 个人评分 简介 如果你面对下面其中的一个问题: 你的Django app需要暴露一个接口,你希望能够收到Oauth2协议的保护 你需要实现Oauth2鉴权服务器,让你的基础设施可以进行token ...
- JavaScript控制输入框只能输入中文,英文和数字的组合,其他字符不能输入的校验
if(!/^[A-Za-z0-9\u4e00-\u9fa5]+/.test(value)){ alert('不能输入非法字符') }
- 用Blackbox Exporter to Monitor web和端口
1.按照exporter .wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbo ...
- Linux用户管理命令介绍
1)管理用户命令总汇 2)管理用户组命令 总汇
- zping ping包工具20180605.exe测试版
链接: https://pan.baidu.com/s/1WB3BZn0r9n4DRU_8bNC65g 提取码: mybi zping的第一个exe版本由于未对兼容性进行测试,使用python3.6编 ...
- Windows主机SAM文件格式破解解密
文件格式如是下图这种格式: 那么就可以通过通过kali终端samdump2 + system + sam 生成出来通过hashcat -m 1000去跑,或者通过md5查询
- centOS重启网络服务报错
1:启动网卡报错(Failed to start LSB: Bring up/down networking )解决办法总结 将 NetworkManager关闭, systemctl stop Ne ...
- Python 常用单词
Python常用单词(英文好的人自动忽略) 单词 发音 翻译 作用 print 普润特 打印 显示我们想要查看的内容 input 因普特 输入 获取用户输入的一些内容 int 印特 整型 将有引号的数 ...