xtrabackup是基于InnoDB存储引擎灾难恢复的。它复制InnoDB的数据文件,尽管数据文件在内部是非一致性的,但在执行灾难恢复时可以保证这些数据文件是一致的,并且可用。

官方原理

在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。

上面就是xtrabackup的备份过程。接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像MySQL刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

以上的过程在xtrabackup的编译二进制程序中实现。程序innobackupex可以允许我们备份MyISAM表和frm文件从而增加了便捷和功能。Innobackupex会启动xtrabackup,直到xtrabackup复制数据文件后,然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyISAM表数据刷到硬盘上,之后复制MyISAM数据文件,最后释放锁。

备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以MyISAM表数据与InnoDB表数据是同步的。类似Oracle的,InnoDB的prepare过程可以称为recover(恢复),MyISAM的数据复制过程可以称为restore(还原)。

xtrabackup和innobackupex这两个工具都提供了许多前文没有提到的功能特点。手册上有对各个功能都有详细的介绍。简单介绍下,这些工具提供了如流(streaming)备份,增量(incremental)备份等,通过复制数据文件,复制日志文件和提交日志到数据文件(前滚)实现了各种复合备份方式。

自己的理解

xtrabackup只能备份和恢复InnoDB表,而且只有ibd文件,frm文件它不管,恢复时就需要DBA提供frm。innobackupex可以备份和恢复MyISAM表以及frm文件,并且对xtrabackup也做了很好的封装,所以可以使用innobackupex来备份MySQL数据库。还有一个问题,就是innobackupex备份MyISAM表之前要对全库进行加READ LOCK,阻塞写操作,若备份是在从库上进行的话会影响主从同步,造成延迟。对InnoDB表备份不会阻塞读写。

xtrabackup增量备份的原理是:

1)、首先完成一个完全备份,并记录下此时检查点LSN;

2)、然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。

具体来说,首先在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;然后开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。

所以xtrabackup_logfile文件在并发写入很大时也会变得很大,占用很多空间,需要注意。另外当我们使用--stream=tar或者远程备份--remote-host时默认使用/tmp,但最好显示用参数--tmpdir指定,以免把/tmp目录占满影响备份以及系统其它正常服务。

因为logfile里面记录全部的数据修改情况,所以即使在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

xtrabackup的增量备份只能用于InnoDB表,不能用在MyISAM表上。采用增量备份MySQL数据库时xtrabackup会依据上次全备份或增量备份目录对InnoDB表进行增量备份,对MyISAM表会进行全表复制。

流备份(streaming)可以将备份直接保存到远程服务器上。

当执行恢复时,由于复制是不锁表的所以此时数据文件都是不一致的,xtrabackup使用之前保存的redo log对各个数据文件检查是否与事务日志的checkpoint一致,执行恢复:

1)、根据复制数据文件时以及之后已提交事务产生的事务日志进行前滚;

2)、将未提交的事务进行回滚。

这个过程就是MySQL数据库宕机之后执行的crash recovery。

增量备份

在InnoDB中,每个page中都记录LSN信息,每当相关数据发生改变,page的LSN就会自动增加,xtrabackup的增量备份就是依据这一原理进行的。xtrabackup将上次备份(完全备份集或者也是一个增量备份集)以来LSN改变的page进行备份。

所以,要做增量备份第一次就要做一个完全备份(就是将MySQL实例或者说要备份的数据库表做一个完全复制,同时记录LSN),之后可以基于此进行增量备份以及恢复。

增量备份优点:

1)、数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;

2)、支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;

3)、每日备份只产生少量数据,也可采用远程备份,节省本地空间;

4)、备份恢复基于文件操作,降低直接对数据库操作风险;

5)、备份效率更高,恢复效率更高。

恢复与还原

backup的恢复过程中包括恢复和还原两个部分。

我们前面已经说了xtrabackup只备份InnoDB表的ibd文件,而innobackupex可以备份包括InnoDB表在内的其他存储引擎的表的所有数据文件。由于不同引擎表备份时的不同,也会让恢复过程看起来不一样。

先来看看完全备份集的恢复。

在InnoDB表的备份或者更直接的说ibd数据文件复制的过程中,数据库处于不一致的状态,所以要将xtraback_logfile中尚未提交的事务进行回滚,以及将已经提交的事务进行前滚,使各个数据文件处于一个一致性状态,这个过程叫做“准备(prepare)”。

如果你是在一个从库上执行的备份,那说明你没有东西需要回滚,只是简单的apply redo log就可以了。另外在prepare过程中可以使用参数--use-memory增大使用系统内存量从而提高恢复速度。

之后,我们就可以根据backup-my.cnf中的配置把数据文件复制回对应的目录了,当然你也可以自己复制回去,但innobackupex都会帮我们完成。在这里,对于InnoDB表来说是完成“后准备”动作,我们称之为“恢复(recovery)”,而对于MyISAM表来说由于备份时是采用锁表方式复制的,所以此时只是简单的复制回来,不需要apply log,这个我们称之为“还原(restore)”。

注:本文档里之所以使用恢复和还原,也是和其他数据库比如Oracle看起来一样。

对于增量备份的恢复过程,与完全备份集的恢复类似,只是有少许不同:

1)、恢复过程需要使用完全备份集和各个增量备份集,各个备份集的恢复与前面说的一样(前滚和回滚),之后各个增量备份集的redo log都会应用到完全备份集中;

2)、对于完全备机集之后产生的新表,要有特殊处理方式,以便恢复后不丢表;

3)、要以完全备份集为基础,然后按顺序应用各个增量备份集。

流备份和压缩

提到流备份(streaming)就要说远程备份和备份压缩,先说流备份吧。

流备份是指备份的数据通过标准输出STDOUT传输给tar程序进行归档,而不是单纯的将数据文件保存到指定的备份目录中,参数--stream=tar表示开启流备份功能并打包。同时也可以利用流备份到远程服务器上。

举例来说,

$ innobackupex --stream=TAR ${BACKUP_DIR}/base | gzip > ${BACKUP_DIR}/base.tar.gz $ innobackupex --stream=TAR ${BACKUP_DIR}/base|ssh somebackupaddr “cat > ${DIR}/base.tar”

当然了,如果你使用了流备份,那么增量备份也就不能用了,因为增量备份需要参考次备份情况,而上次备份却被打包或者压缩了。

在我们现实使用中,更多的使用增量备份,至于归档压缩我们可以通过脚本自主完成。

部分备份和恢复

xtrabackup可以只备份/恢复部分库表,可以正则模式匹配或者是你想备份库表的列表,但InnoDB表必须是独立表空间,同时不能使用流备份功能。

1)、使用正则模式匹配备份部分库表,需要使用参数--include,语句类似如下:

$ innobackupex --include=’^qb.*’ ${BACKUP_DIR}/part-base

2)、使用数据库列表备份部分库,需要使用参数--databases,语句类似如下:

$ innobackupex --databases=qb0 qb1 qb2 qb3 ${BACKUP_DIR}/part-base

3) 、使用表列表备份部分表,需要使用参数--tables-file,语句类似如下:

$ innobackupex --tables-list=${CONF_DIR}/tab.conf ${BACKUP_DIR}/part-base

注:在我们的现实应用中,很少会只备份集群中部分库表,所以只是了解此功能即可,若有现实需要可以参考percona官方资料以获取更多信息。

能备份部分库表,也就能根据完全备份集进行部分库表的恢复,在现实中很少会用到,但还是说一下吧。

首先在“准备prepare”的过程中,使用参数--export将表导出,这个导出会将每个InnoDB表创建一个以.exp结尾的文件,这些文件为之后的导入过程服务。

$ innobackupex --apply-log --export ${BACKUP_DIR}/base

然后将你需要恢复的表的ibd和exp文件复制到目标机器,在目标机器上执行导入:

mysql> create table t()engine=innodb; //此处需要DBA手动创建一个同结构的表或表已存在 mysql> ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql> ALTER TABLE t IMPORT TABLESPACE;

这样的导出导入就可以保住恢复的表可以与数据库其他表保持一致性了。

并行备份

xtrbackup还支持并行备份,默认情况下xtrabackup备份时只会开启一个进程进行数据文件的备份,若配置参数--parallel=N可以让xtrabackup开启N个子进程对多个数据文件进行并发备份,这样可以加快备份的速度。当然服务器的IO处理能力以及对服务器的影响也是要考虑的,所以另一个参数--throttle=IOS会与它同时使用,这个参数用来限制备份过程中每秒读写的IO次数,对服务器的IO是一个保护。

这两个参数xtrabackup和innobackupex都支持,举例如下:

$ innobackupex --parallel=4 --throttle=400 ${BACKUP_DIR}/part-base

注意:对同一个数据文件只会有一个进程在备份。

其他

xtrabackup在备份时主要的工作是做数据文件复制,它每次只会读写1MB的数据(即64个page,不能修改),xtrabackup逐页访问1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。

在复制事务日志的时候,每次读写512KB的数据,同样不可以配置。

xtrabackup工具的更多相关文章

  1. xtrabackup工具安装

    1.首先从官网上http://www.percona.com/下载较新版本的xtrabackup percona-xtrabackup-2.2.7-5050-Linux-x86_64.tar.gz 2 ...

  2. mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)

    一.概述 物理备份和恢复又分为冷备份和热备份.与逻辑备份相比,它最大优点是备份和恢复的速度更快.因为物理备份的原理都是基于文件的cp. 1.1 冷备份 冷备份就是停掉数据库服务.这种物理备份一般很少使 ...

  3. MySQL运维之--xtrabackup工具的原理和使用方法

    Xtrabackup工具的介绍 xtrabackup是percona公司开发的一款自由.免费.开源的一款备份工具,他的备份特点就是:支持热备.备份速度快. xtrabackup包含两个重要的工具:in ...

  4. 通过xtrabackup工具对mysql数据库做全备

    需求描述: 使用xtrabackup工具对mysql实例中的所有的数据库进行备份,并且将备份的过程输出到指定的日志文件中. 操作过程: 1.使用xtrabacup工具备份mysql实例 xtrabac ...

  5. percona-mysql5.7.24使用xtrabackup工具配置主从同步

    主从配置详细过程: 环境准备: 配置好服务器,主从服务器都安装并启动mysql数据库 # 添加读写账号和只读账号,应用配置中,写主库用读写账号,统计从库数据yoga只读账号 grant select, ...

  6. MySQL数据库备份之xtrabackup工具使用

    一.Xtrabackup备份介绍及原理 二.Xtrabackup的安装 1.在centos7上基于yum源安装percona-xtrabackup软件 [root@node7 ~]# yum -y i ...

  7. MySQL数据备份与恢复(二) -- xtrabackup工具

    上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为普遍的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容. 1.  xtrabackup 工具的安装 1.1  安装依赖包 ...

  8. xtrabackup工具备份与恢复

    1.xtrabackup简介 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品.它能对 ...

  9. Mariadb使用xtrabackup工具备份数据脚本

    #!/bin/bash#这个脚本用来备份SQL文件: sql_home="/home/mysql"sql_bak_log="$sql_home/xtrabackup.lo ...

随机推荐

  1. Linux 本人常用到的基本命令

    cat -n FileName //查看FileName文件的内容.-n显示对应行号. yum install SoftName //安装软件,切记使用root权限. service //查看服务.例 ...

  2. 仿淘宝详情转场(iOS,安卓没有这功能)

    由于公司是做跨境电商的,所以对各大电商APP都有关注,最近看到淘宝iOS端(安卓没有)在商品详情点击加入购物车有一个动画效果特别赞,正好今天新版本上线,下午就抽了些时间研究了下. 主要思路是自定义转场 ...

  3. 使用 Intellij Idea 导出JavaDoc

    使用/* ...... /来注释代码,解释方法参数,返回参数,类的功能及用法. 常用的注释标签: @author 作者 @version 版本 @see 参考转向 @param 参数说明 @retur ...

  4. 1. IOS 9.3.3描述文件没了处理方法

    1.用手机登录:https://beta.apple.com/ 2.找到"注册您的设备" 3.往下拉第二点就是,直接点击下载即可.

  5. Deep Learning(深度学习)学习笔记整理(二)

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之 ...

  6. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  7. newCachedThreadPool线程池

    public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任 ...

  8. linux C学习笔记02--共享内存(进程同步)

    system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ...

  9. xfire webServeic 例子

    xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...

  10. Android菜鸟成长记5-ADB和sqllite

    Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...