为什么要使用FTWRL

  MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一。当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona-xtrabackup),为了保证数据的一致性,这两种备份方式都会在备份过程中执行 flush table with read lock 这个命令(**以下简称为FTWRL**),通过执行FTWRL,来对事务和非事务表来加table level级别的共享锁,取得此时的gtid或者binlog偏移量,继而得到某一个时间点的备份数据。

 

FTWRL是如何工作的

  在过去的很长一段时间内,我们做备份一直是按以上的方式来做的,那么这种依靠FTWRL这种方式获得备份点的做法是否真的合理,对数据库有什么不良的影响吗?

  首先让我们来看下,FTWRL具体做了哪些事情,当flush tables with read lock这条命令在数据库中被执行的时候,执行逻辑可以分为下面的几个步骤:

步骤一、请求获得相关类型的 MDL lock,这里我们暂时称之为 FTWRL_MDL_LOCK.
步骤二、清空query cache中的内容(当前应该很少有人开启这个功能了)
步骤三、FLUSH TABLES,将当前所有打开的table的fd关闭
步骤四、请求获得全局table-level lock
步骤五、
上全局COMMIT锁(make_global_read_lock_block_commit)


  以上步骤,在某些db场景下会产生非常严重的问题,我们以下面栗子说明: 
  当有很大的事务在进行的时候,此时FTWRL的步骤一,步骤二可以完成,但是进行到步骤三的时候,由于表相关的事务正在执行中,相应table的句柄被占用,无法进行flush table操作。

  笔者当时在现网就遇到这种情景,当时使用的工具是mydumper,该工具在进行到FTWRL步骤的时候,在步骤三卡住了,此时工具hang在那里,但是还误以为加锁失败,自然对业务不会造成影响,实际上步骤一,步骤二已经成功执行了,要命的是步骤一的FTWRL_MDL_LOCK对DML事务的排他的,所以在工具hang住的期间,其他的后续DML事务都是被阻塞的 -_-

 

有比FTWRL更好的方法吗

  我们发现FTWRL是一种非常重量级锁,或者说采取了一些额外过度的动作。有非常大的可能失败,比如非常大的事务正在执行,这时候会被阻塞;而阻塞的时候又会影响其他的DML事务的执行,这时候是很危险的!

  那是否有改良的更好方案呢,percona的回答的是肯定的,在 5.6.16-64.0这个版本中,percona开始引入了两个新的MDL类型的锁,相应的引入了两个新的备份命令

 >  LOCK TABLES FOR BACKUP
> LOCK BINLOG FOR BACKUP
 

lock tables for backup

  执行该命令后,获得的新的MDL锁会阻塞对非事务表的更新及所有DDL动作,此时其他用户可以继续更新inonodb引擎的表,但是无法对myisam表进行更新动作。

 

lock binglog for backup

  执行该命令后,如果加锁成功,将会阻塞binglog的更新,此时所有的DML操作被阻塞。

 那么通过上面两个命令在获取一致性的数据备份相比之前用FTWRL,有什么好处呢,我们通过下面两张图可以看到区别:

  首先我们看下在非percona-5.6.16-64.0版本中。xtrabackup的工作流程:

  然后我们看下percona-5.6.16-64.0版本及以上中,xtrabackup备份的流程是怎样的: 

从上面两张图我们可以总结如下: 
  1、使用FTWTRL备份的方式,如果myisam表数量众多,或者当前有大事务在执行,FTWTRL处于等待或者FTWTRL保持,这个时间段期间,后续对innod的DML都将被阻塞,因此时间持续越长,对业务影响越大。 
  2、使用 lock tables for backup备份myisam表期间,对innodb的dml事务无影响,且加锁过程不受当前是否有大事务正在执行的影响

  我们可以发现使用 lock table和lock binlog来备份数据,不仅可以实现更轻量级的上锁,并且可以节约myisam备份期间对业务的写操作影响,我在percona server的环境下试验证了以下,可以看到xtrabackup不再使用FTWRL命令了 

  percona这个小的改动解决了之前长期以来热备数据的问题,特别是非percona server 版本下的云平用户有的执着使用myisam引擎,在备份期间非常容易造成监控程序的写入失败,从而触发告警,-_-。

flush table with read lock的轻量级解决方案的更多相关文章

  1. flush table with read lock的轻量级解决方案[原创]

    为什么要使用FTWRL   MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一.当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona ...

  2. FLUSH TABLE WITH READ LOCK详解

    FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关 ...

  3. mysqldump中使用flush tables with read lock的风险分析

      http://blog.csdn.net/wireless_tech/article/details/7332906   我们使用mysqldump --single-transaction -- ...

  4. FLUSH TABLES WITH READ LOCK

    最近在mysql主从复制中用到锁,翻了资料回忆一下.一下内容参考于:http://blog.csdn.net/arkblue/article/details/27376991 1.FLUSH TABL ...

  5. FLUSH TABLES WITH READ LOCK 锁全局

    [root@wx03 ~]# cat a3.sh mysql -uroot -p1234567<<eof use scan; FLUSH TABLES WITH READ LOCK; sy ...

  6. FLUSH TABLES WITH READ LOCK 获取锁的速度

    最近有一台MySQL的从库老是报延迟,观察到:FLUSH TABLES WITH READ LOCK,阻塞了4个多小时,还有另外一条SQL语句select *,从现象上来看是select * 阻塞了f ...

  7. MySQL flush tables with read lock

    mysql> flush tables with read lock; flush tables with read lock 会去关闭已经打开的所有文件,它要做这个操作就先要拿到锁:当发起这个 ...

  8. [Oracle]如何观察Table 的各种Lock 之间的冲突

    [Oracle]如何观察Table 的各种Lock 之间的冲突 举例: Session#15 创建表: SID 15==============create table t1 (c1 number)p ...

  9. FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较

    1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行.解 ...

随机推荐

  1. 如何在WS系统的DOS命令台打印JAVA_HOME变量

    echo %JAVA_HOME% 查看环境变量 path 新增临时环境变量 path D:\test;%path% 注意是反斜杆 cls 清空 F7 显示历史CMD指令

  2. ie 8及以下 前端cors ajax跨域须知

    http://www.cnblogs.com/xishuai/p/jquery-ajax-ie8-cors.html

  3. JS 返回上一页并刷新,但不用重新加载整个页面(ajax实现)

    需求 有三个页面A.B.C,点击A=>B,点击B=>C,在C中添加内容,点击确定返回到B,此时B页面需重新加载新的内容.再次点击B的返回按钮,希望返回到A而不是C. ===== 2017/ ...

  4. [Objective-C语言教程]扩展(30)

    类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译). 类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如Cocoa或Cocoa Touc ...

  5. Machine learning 第5周编程作业

    1.Sigmoid Gradient function g = sigmoidGradient(z) %SIGMOIDGRADIENT returns the gradient of the sigm ...

  6. 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)

    传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...

  7. [转] 使用HTTPS在Nexus Repository Manager 3.0上搭建私有Docker仓库

    FROM: https://www.hifreud.com/2018/06/06/03-nexus-docker-repository-with-ssl/ 搭建方式 搭建SSL的Nexus官方提供两种 ...

  8. Mac 10.12安装数据库管理工具MySQL Workbench

    说明:跨平台的MySQL管理工具.别纠结是不是反人类的了,这款用熟了也很溜. 下载: (链接: https://pan.baidu.com/s/1b3VtmA 密码: 6hka)

  9. Java基本数据类型-包装类

    为什么会有基本数据类型包装类? 将基本数据类型封装成为对象,这样可以在对象中定义更多的方法来操作该数据 包装类常用操作就是用于基本数据类型与字符串之间的转换 基本数据类型对应的包装类 byte(Byt ...

  10. hibernate多对多单向关联

    多对多单向,一个学生可以有多个老师,一个老师也可以教多个学生.老师可以找到他的学生,学生找不到教他的老师. 老师类Teacher: package com.oracle.hibernate; impo ...