原文地址:http://www.innomysql.net/article/25590.html

前言

淘宝3月的数据库内核月报对 xtrabackup的备份原理 做了深入的分析,写的还是很不错。不过Inside君在看完之后,感觉没有对一个细节问题进行比较深入的介绍。而此问题可能会导致备份文件恢复后丢失相关数据,之前Inside君在 MySQL 5.6对于Xtrabackup的影响 一文中已经做了简单的说明,今天借着淘宝数据库内核组的文章再拿来提醒下各位小伙伴。Inside君还是先给出结论:尽可能地使用新版本Xtrabackup工具备份MySQL数据库。

正文

在淘宝数据库内核组的文章中写到Xtrabackup在备份结束时会按下面的步骤执行操作(有所简化,具体见原文):

  • FLUSH TABLES WITH READ LOCK(FTWRL)
  • 拷贝所有非事务表,如系统MyISAM表
  • 拷贝重做日志
  • UNLOCK TABLES

但是这里少了一个步骤,那就是在拷贝重做日志前,备份工具还会去执行如下操作,该操作会将InnoDB层的重做日志持久化到磁盘然后再进行拷贝:

<span>FLUSH</span> <span>NO_WRITE_TO_BINLOG</span> <span>ENGINE LOGS</span>

这个细节非常关键,因为不执行该操作可能会导致备份丢失一部分的数据,然后再进行主从复制的话,同步可能报错。如果要分析原因,还是得从下面的提交过程图来看:

在上图显示的事务提交过程中,1这个步骤会进行一次fsync,确保日志落盘。但是从MySQL 5.6版本开始,已经不再需要2这个步骤执行fsync了,少了这样的I/O操作可以提升数据库的性能,而这对数据一致性是没有影响的,因此已经写入到二进制日志的事务在恢复的过程中一定是提交的。然而,问题在于Xtrabackup并不拷贝二进制日志。那么就有可能在恢复过程中存在下面的这种情况:

也就是说如果Xtrabackup备份的时候没有备份上图左边的最后一个InnoDB的commit log,这个事务在恢复的过程中就会丢失,简单来说就是数据丢失。Xtrabackup 2.2.3版本修复了此问题,具体可见: https://launchpad.net/percona-xtrabackup/2.2/2.2.3-ga

另外一个小细节是Xtrabackup备份是,如果数据库是Percona Server分支版本的话,那么其使用的不是FLUSH TABLE WITH READ LOCK来获取位置信息,这样的需要把表都关了,而且InnoDB表这时也将不可写入。因此Percona Server版本新增了两个新的命令LOCK TABLES FOR BACKUP和LOCK BINARY LOG FOR BACKUP,因此备份流程变为了:

LOCK TABLES FOR BACKUP

... copy .frm, MyISAM, CSV, etc. ...

LOCK BINLOG FOR BACKUP

UNLOCK TABLES

... get binlog coordinates ...

... wait for redo log copying to finish ...

UNLOCK BINLOG

按照上述逻辑实现的话,InnoDB表只会在备份的最后获取二进制日志位置时被锁住,相对原来的实现锁定的时间又有进一步的缩短,当然这取决于你非事务表的数量,如果全是InnoDB存储引擎用户表的话,那么提升也是有限的。

研究备份实现原理还是非常有意思的一件事情,比如增量备份的实现其实还存在另一些细节可挖掘。若有小伙伴想进一步掌握内部的实现原理,可以去GitHub上翻看下Xtrabackup的源码哦~~~

xtrabackup拷贝redolog前做的细节操作的更多相关文章

  1. AsyncTask onPreExecute方法用于在执行后台任务前做一些UI操作

    1.实例化 TableListsTask task = new TableListsTask(ServerIP,"ALL", MenuActivity.this);   //第三参 ...

  2. 使用 Xtrabackup 在线对MySQL做主从复制【转】

    1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...

  3. python03-break、continue、for循环、数据bytes类型、字符串与字节的关系、变量指向与深浅拷贝、set集合、文件操作

    目录: 1.break.continue 2.for循环 3.数据bytes类型 4.字符串与字节的关系 5.变量指向与深浅拷贝 6.set集合 7.文件操作 一.break.continue bre ...

  4. 使用 Xtrabackup 在线对MySQL做主从复制

    1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...

  5. openerp模块收藏 auto_setup 自动帮你完成建新库时必做几个操作(转载)

    auto_setup 自动帮你完成建新库时必做几个操作 原文:http://shine-it.net/index.php/topic,6777.0.html 模块地址: https://github. ...

  6. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  7. 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求

    一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...

  8. 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息

    三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.

  9. WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...

随机推荐

  1. Map 合并

    比如说 qq.com 100 163.com  90 QQ.COM 10 Qq.Com  5 …… 如果统计的话,需要忽略大小写的,即 QQ邮箱总共是100+10+5,怎么写? 其实这个应该不难的,就 ...

  2. 掩膜操作手写+API(第二天)

    1.1首先是用到的理论知识: 上面是一个通用的公式,光知道上面写程序还是有点麻烦的,下面公式画的有点丑,可以表达我的观点. 1.2用到的知识点:可以边看程序边看用到的知识点: CV_Assert(); ...

  3. spring boot 整合MongoDB

    参考     https://www.cnblogs.com/nbfujx/p/7999171.html

  4. delphi RAD Studio新版本及路线图 及官方网站 官方 版本发布时间

    delphi  RAD Studio Berlin 10.1 主要是FireMonkey 移动开发的改动,VCL确实没有多大变化. http://docwiki.embarcadero.com/RAD ...

  5. plsql 粘贴

    plsql 粘贴

  6. Spring MVC 视图及视图解析器

    org.springframework.web.servlet.view.InternalResoureceViewResolve 把逻辑视图改为物理视图 可混用多种视图 不进过Handler直接进入 ...

  7. as2 loadClip

    loadClip(url:String, target:Object) : Boolean target是直接被赋值,而不是add进去

  8. 泛型集合与DataSet相互转换

    一.泛型转DataSet /// <summary> /// 泛型集合转换DataSet /// </summary> /// <typeparam name=" ...

  9. 使用webstorm创建vue项目

    进行vue开发首先需要配置node环境 配置好node环境在命令行中输入node -v npm -v则表示环境配置成功 在webstorm命令行中输入命令 1.安装脚手架 npm install -g ...

  10. ArrayList 原理(2)

    1. 概述 关于Java集合的小抄中是这样描述的: 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预 ...