XtraBackup之踩过的坑

xtrabackup相信目前使用已经非常广泛了,备份innodb表的首选工具,但是其中还是有点小坑,虽然发生的概率不大,但是我还是踩坑了。关于xtrabackup的详细参考请查阅官方文档http://www.percona.com/doc/percona-xtrabackup/2.2/intro.html

突然收到报警,说从库延时,登录服务器执行show full processlist查看,发现有如下状态(自己模拟的,和当时线上情况一样):

可以看见这里的INSERT语句卡住了,在等待一个全局锁,所以导致从库延时。那么问题来了。。。。。为什么有一个全局锁,FLUSH TABLES WITH READ LOCK。后来发现是刚不久在从库加了一个备份脚本,备份工具采用的是Percona的xtrabackup工具。这个工具在拷贝完文件以后需要执行FLUSH TABLES WITH READ LOCK。如下图:

由于需要执行FLUSH TABLES WITH READ LOCK (以下用FTWRL缩写代替)来获取全局GLOBAL的MDL锁,因此可以看到"wait for global read lock"之类的信息。如果备库存在大查询,或者复制线程正在执行比较漫长的DDL,并且FTWRL被block住,那么随后的QUERY都会被block住,导致业务不可用引发故障。

刚好在percona博客看到一篇文章,里面大概是这样说FTWRL。

What’s the problem with FTWRL anyway?

A lot has been written on what FLUSH TABLES WITH READ LOCK really does. Here’s yet another walk-through in a bit more detail than described elsewhere:

  1. It first invalidates the Query Cache.
  2. It then waits for all in-flight updates to complete and at the same time it blocks all incoming updates. This is one problem for busy servers.
  3. It then closes all open tables (the FLUSH part) and expels them from the table cache. This is also whenFTWRL has to wait for all SELECT queries to complete. And this is another, even bigger problem for busy servers, because that wait happens to occur with all updates blocked. What’s even worse, the server at this stage is essentially offline, because even incoming SELECT queries will get blocked.
  4. Finally, it blocks COMMITs.

1.它首先使查询缓存无效。
2.然后,等待所有更新完成,并在同一时间,它阻止所有的更新。这对于繁忙的服务器是一个问题。
3.然后,它关闭所有打开的表(冲洗表)并且从表中的高速缓存刷出。这也是当FTWRL必须等待所有的SELECT查询完成。这是另一个更大的问题为繁忙的服务器,因为等待恰好发生这将堵塞所有的更新。更糟的是,服务器在这个阶段基本上是离线状态,因为即使进入的SELECT查询将被封锁。
4.最后,它会阻止事务提交。

总结:

本次的复制延时故障由于从库在执行大查询,而且效率很差,刚好备份脚本执行,由于xtrabackup执行FLUSH TABLES WITH READ LOCK施加全局锁,导致锁等待。这时刚好从库执行INSERT操作,最后导致无法插入,等待全局锁,导致复制延时。这种情况Percona和Facebook都有相应的解决方案。最后xtrabackup从2.1版本开始,有参数预防类似的事情发生,感兴趣的同学自己查询xtrabackup官方文档。

参考资料

http://m.csdn.net/article/2015-01-20/2823634

http://www.percona.com/blog/2014/03/11/introducing-backup-locks-percona-server-2/

http://www.percona.com/blog/2010/04/24/how-fast-is-flush-tables-with-read-lock/

http://www.percona.com/doc/percona-xtrabackup/2.2/innobackupex/improved_ftwrl.html

时间: 2024-10-12 21:14:35

XtraBackup之踩过的坑的相关文章

《C++之那些年踩过的坑(附录一)》

C++之那些年踩过的坑(附录一) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. [版权声明]转载请注明原文来自:http://www.cnblogs.com/GodA/p/6639526.html 本来上个月就开始动笔了,直到现在才发出来,实在太多事情.可能有些小朋友不知道写这一篇随笔的起因,那么你可以看一下我之前写的. 上一篇的最后,我提到了一个问题:代码优化.并留了一个小测试:无符号数与有符号数的性能比

【转载】Fragment 全解析(1):那些年踩过的坑

http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使用姿势3.Fragment之我的解决方案:Fragmentation 本篇主要介绍一些最常见的Fragment的坑以及官方Fragment库的那些自身的BUG,这些BUG在你深度使用时会遇到,比如Fragment嵌套时或者单Activity+多Fragment架构时遇到的坑.如果想看较为实用的技巧,

初学spring boot踩过的坑

一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-

用vue-cli搭建项目踩过的坑

1. 需要额外安装sass-loader: 我以为vue-cli会安装所有与css相关的loader,然并非,为这个死了很多脑细胞. npm install sass-loader node-sass webpack --save-dev 2. 修改style标签: 打开src目录下的components目录中的App.vue文件.然后修改 style标签如下: <style lang="sass" rel="stylesheet/sass"> 3. s

sqlalchemy 踩过的坑

记录下Sqlalchemy遇到的问题,不定时更新. 设置主键为非自增 sqlalchemy 在sql server中默认主键是自增的,如果在数据库设置的主键不是自增的,这个时候插入就会出现异常: 提示does not have the identity property 这个时候需要在主键中设置autoincrement=False,显示表示非自增,才能正常写入 sqlalchemy 踩过的坑

springmvc上传文件 踩过的坑

spring-root.xml中配置 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="9000000"/> <property name="maxInM

多线程和异步编程示例和实践-踩过的坑

上两篇文章,主要介绍了Thread.ThreadPool和TPL 多线程异步编程示例和实践-Thread和ThreadPool 多线程异步编程示例和实践-Task 本文中,分享两则我们在做多线程和异步编程中实际踩过的坑,实际生产环境遇到的问题,以及解决办法. 1. HttpClient 业务场景:使用HttpClient实现第三方业务推送,当第三方的Http服务器不通.或者返回很慢时 线程数暴涨 Asp.Net\Asp.Net MVC场景下,并发多线程导致的线程阻塞:HttpClient.Pos

1.MySQL5.7.19 安装配置踩过的坑

这篇文章主要是分享 安装MySQL时遇到的一些问题,以及解决方法. 第一步:下载MySQL 下载地址:https://dev.mysql.com/downloads/mysql/5.1.html#downloads 我下载的是5.7.19版本,下载地址里面也只有解压版,下载后再进行环境变量的配置就可以. 2.解压并安装Mysql5.7.19 (1)将下载的包解压到指定的路径,自己可以指定路径,我直接解压到了D盘,解压到了                         D:\mysq的目录下.则

Fragment全解析系列(一):那些年踩过的坑

Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使用姿势3.Fragment之我的解决方案:Fragmentation 本篇主要介绍一些最常见的Fragment的坑以及官方Fragment库的那些自身的BUG,这些BUG在你深度使用时会遇到,比如Fragment嵌套时或者单Activity+多Fragment架构时遇到的坑.如果想看较为实用的技巧,请直接看第二篇 Fragment是可以让你的app纵享丝滑的设计,如果你的a