Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上唯一一款开源的可以对innodb和xtradb数据库进行热备的工具。php
Xtrabackup中主要包含两个工具:html
xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其余类型的表,也不能备份数据表结构;mysql
innobackupex:是将xtrabackup进行封装的perl脚本,能够备份和恢复MyISAM表以及数据表结构。sql
一段官方文档的说明:数据库
http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html服务器
It is possible to use the xtrabackup binary alone, however, the recommend way is using it through the innobackupex wrapper script and let it execute xtrabackup for you. It might be helpful to first learn how to use innobackupex, and then learn how to use xtrabackup for having a better low-level understanding or control of the tool if needed.并发
官方文档:http://www.percona.com/docs/wiki/doku.php?id=percona-xtrabackup:xtrabackup_manualapp
XtraBackup对Innodb的备份之因此是热备,无需锁表,是基于Innodb自身的崩溃恢复机制,它首先复制全部的Innodb数据文件,这样复制出来的文件确定是不一致的,而后对每一个文件进行崩溃恢复处理,最终达到一致。就和MySQL在启动Innodb的时候同样,会经过比较数据文件头和redo log文件头信息来检查数据是不是一致的,若是不一致就尝试经过前滚(把redo log中全部提交的事务写入数据文件)和回滚(从数据文件中撤销全部redo log中未提交的事务引发的修改)来使数据达到最终一致。工具
XtraBackup在启动的时候会记录一个LSN(log sequence number),而后就把全部的Innodb数据文件复制出来,这样复制出来的数据文件是不一致的,可是XtraBackup会在后台运行一个进程把全部对redo log file的修改记录下来,只要有了这个数据,就能进行崩溃恢复。只因此要额外记录下来,是由于MySQL自身的redo log file是可重用的。rest
以上的操做是由xtrabackup二进制程序(好比xtrabackup_55)完成的,若是使用innobackupex 脚本,刚才的步骤完成之后,innobackupex就会去备份MyISAM表和.frm文件,这时要保证数据的一致性就会先锁表了,经过FLUSH TABLES WITH READ LOCK命令锁表而后把文件复制出来,再释放掉这个锁。
在恢复数据的时候,要通过prepare(recovery)和restore两个步骤。在prepare结束之后,Innodb的表恢复到了复制Innodb文件结束的时间点,这个时间点也就是锁表复制MyISAM表的起点,因此最终数据是一致的。通常咱们在恢复的时候执行两次prepare,是由于第二次prepare会帮助咱们生成redo log文件,从而加快MySQL数据库启动的速度。
增量备份:
在InnoDB中,每一个page中都记录LSN信息,每当相关数据发生改变,page的LSN就会自动增长,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保持数据的一致。
2 innobackupex工做原理
官方文档:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/how_innobackupex_works.html
2.1 备份
若是在程序启动阶段未指定模式,innobackupex将会默认以备份模式启动。
默认状况下,此脚本以–suspend-at-end选项启动xtrabackup,而后xtrabackup程序开始拷贝InnoDB数据文件。当xtrabackup程序执行结束,innobackupex将会发现xtrabackup建立了xtrabackupsuspended2文件,而后执行FLUSH TABLES WITH READ LOCK,此语句对全部的数据库表加读锁,而后开始拷贝其余类型的文件。
若是–ibbackup未指定,innobackupex将会自行尝试肯定使用的xtrabackup的binary。其肯定binary的逻辑以下:首先判断备份目录中xtrabackup_binary文件是否存在,若是存在,此脚本将会依据此文件肯定使用的xtrabackup binary。不然,脚本将会尝试链接database server,经过server版本肯定binary。若是链接没法创建,xtrabackup将会失败,须要自行指定binary文件。
在binary被肯定后,将会检查到数据库server的链接是否能够创建。其执行逻辑是:创建链接、执行query、关闭链接。若一切正常,xtrabackup将以子进程的方式启动。
FLUSH TABLES WITH READ LOCK是为了备份MyISAM和其余非InnoDB类型的表,此语句在xtrabackup已经备份InnoDB数据和日志文件后执行。在这以后,将会备份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 类型的文件。
当全部上述文件备份完成后,innobackupex脚本将会恢复xtrabackup的执行,等待其备份上述逻辑执行过程当中生成的事务日志文件。接下来,表被解锁,slave被启动,到server的链接被关闭。接下来,脚本会删掉xtrabackupsuspended2文件,容许xtrabackup进程退出。
2.2 恢复
为了恢复一个备份,innobackupex须要以–copy-back选项启动。
innobackupex将会首先经过my.cnf文件读取以下变量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并肯定这些目录存在。
接下来,此脚本将会首先拷贝MyISAM表、索引文件、其余类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下来拷贝InnoDB表数据文件,最后拷贝日志文件。拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能须要更改文件的owener(如从拷贝文件的user更改到mysql用户)。
3.1 彻底备份:
innobackupex –user=root -p /home/backup/
备份后的文件:在备份的同时,备份数据会在备份目录下建立一个以当前日期时间为名字的目录存放备份文件。
各文件说明:
(1) backup-my.cnf —— 备份命令用到的配置选项信息;
(2) ibdata —— 备份的表空间文件;
(3) xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
(4) xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;
(5) xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
(6) xtrabackup_logfile —— 备份的重作日志文件。
在使用innobackupex进行备份时,还可使用–no-timestamp选项来阻止命令自动建立一个以时间命名的目录;如此一来,innobackupex命令将会建立一个BACKUP-DIR目录来存储备份数据。
3.2 准备(prepare)一个彻底备份
通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处理不一致状态。“准备”的主要做用正是经过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobakupex命令的–apply-log选项可用于实现上述功能。
innobackupex –apply-log /home/backup/2014-05-03_17-21-11/
执行成功,显示以下:
在实现“准备”的过程当中,innobackupex一般还可使用–use-memory选项来指定其可使用的内存的大小,默认一般为100M。若是有足够的内存可用,能够多划分一些内存给prepare的过程,以提升其完成速度。
3.3还原数据库
(1)模拟数据库损坏
直接使用删除数据目录文件来模拟损坏:
(2)还原彻底备份:
innobackupex命令的–copy-back选项用于执行恢复操做,其经过复制全部数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex经过backup-my.cnf来获取DATADIR目录的相关信息。
innobackupex –copy-back /home/backup/2014-05-03_17-21-11/
若是执行正确,其输出信息的最后几行一般以下:
(3)修改还原后的数据目录权限:
(4)启动MySQL
/bin/sh /usr/bin/mysqld_safe –defaults-file=/etc/my.cnf &
(5)验证还原后的数据: