注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

一起走进MySQL备份身后的故事(篇二 无锁的备份)  

来自郭忆   2014-04-01 23:29:49|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |
XtraBackup
XtraBackupPercona公司一款开源的数据库备份软件,相对于mysqldump,它是直接通过拷贝物理文件实现数据库备份的,所以速度相比要快很多。XtraBackup包含两部分:xtrabackupc程序和innobackupex perl脚本;前者主要用于处理innodb表的备份;后者是前者的封装,主要包括一些与MySQL服务器的通信和mysiam表的备份。

首先我们先来简单的了解一下xtrabackup备份的基本原理。xtrabackup能够实现针对innodb表的无锁备份,即所有的读写请求、DDL语句在整个备份过程中都是不受影响的。它的实现是基于innodb对事务的支持,利用其崩溃恢复的功能来实现的。MySQL所有的更新操作都是在内存中完成的,然后异步的刷入磁盘进行持久化。支持事务的存储引擎,为了保证MySQL宕机后内存中还未刷出的更新不会丢失,设计了事务引擎日志(redo log)。通过将该部分的更新记录到日志中,然后记录日志序号(LSN),异步线程在将脏页刷新到磁盘的同时,维护一个检查点LSN,两个LSN之间的差异就是数据宕机后丢失的更新。在数据库启动时,只要事务日志保存完好,就可以根据redo logundo log将数据库恢复到崩溃前的一致性状态。
一起走进MySQL备份身后的故事(篇二 无锁的备份) - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 
上图通过在MySQL执行show engine innodb status,我们可以清楚的看到:
  • Log sequence number:表明当前redo log的最新LSN。
  • Log flushed up to:表明当前已经刷新到磁盘上redo logLSN。
  • Last checkpoint at :redo log记录的更新已经刷新到磁盘上的检查点LSN,该LSN之前的redo log上记录的更新已全部刷新到磁盘上,可以被覆盖重复使用。
xtrabackup备份时,首先会记录一个当前redo log最新的LSN,该点是备份数据一致最后一个矫正点,在利用该备份进行恢复时,即从该LSN作为起点,之后的所有redo log记录的更新都需要重做或者回滚。记录了LSN之后,xtrabackup就找到了一个数据一致点,然后直接拷贝数据文件。
Innodb存储引擎的表文件主要包括以下几类:

  • ibdata1:默认表空间文件,如果没有设置innodb_file_per_table,则所有的表都是共用同一个文件的。如果启动了innodb_file_per_table,每张表的索引、数据和插入缓冲BITMAP信息是按照表分别独立存放在不同的文件中,但是undo log等其他信息还是存放在默认表空间中。
  • table_name.bid:表文件,存放每张表的数据、索引和插入缓冲。
  • ib_logfile0: 重做日志文件,备份前记录的LSN和备份结束时的LSN之间的redo log xtrabackup是需要保存的,用于在恢复时进行回放或者回滚。
MySQLredo log是重用的,即检查点之间的redo log存在被覆盖的风险,而备份前和备份结束后之间的redo log是需要完整保存的,不允许被覆盖,如果备份时间比较长,redo log比较小的情况下,存在备份还没结束,原先记录的LSN之后的redo log即被覆盖,导致更新丢失的问题。为了解决该问题,xtrabackup额外启动了一个线程,不断的扫描redo log日志,一旦发现LSN有推进,则立即将该部分redo log拷贝出来,避免被覆盖。

之后xtrabackup就开始拷贝包括默认表空间文件在内的所有表文件,直到拷贝结束,然后记录LSN,这样就完成了innodb表的备份。

从前面我们对数据库备份过程上锁的必要性的分析可知,除了解决数据文件的一致性外,还需要解决DDL和获取Binlog的问题。而该问题就需要依赖innobackupex来完成,首先在xtrabackup拷贝完数据文件后,innobackupexMySQL上执行flush table with read lock,该操作会锁定整个实例的所有带X锁的读,更新、插入、删除和DDL语句,相当于冻结了LSN。此时MySQL 当前LSN不会再推进,然后记录LSN,此为最终一致的LSN;然后记录当前Binlog的文件名和位置;接着开始拷贝MySQL的表定义文件(.frm)myisam表文件;最后unlock tables释放锁,这样就完成了一次完整的备份过程。

  评论这张
 
阅读(976)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017