Xtrabackup
XtraBackup 是开源的热备mysql的软件,可以备份InnoDB, XtraDB, and MyISAM类型的

表,它是由如下三个工具组成的

1.innobackupex:有perl脚本封装的,可以备份MyISAM, InnoDB, and XtraDB类型表,

推荐使用此工具
2.xtrabackup:由c语言编译的,只copy表InnoDB和XtraDB的数据
3.xbstream:允许从streaming and extracting文件压缩/抽取xbstream格式文件
 
innobackupex
innobackupex有更强的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量

备份/恢复,还可以基于时间的增量备份与恢复。
innobackupex备份原理
innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,

innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ

LOCK”来备份其他的文件
innobackupex恢复原理
innobackupex首先读取my.cnf,查看变量

(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir

)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy

innodb的表、索引和日志

二进制版本
Xtrabackup下载地址:

http://www.percona.com/downloads/XtraBackup/LATEST/binary/
[root@clent soft]# cd xtrabackup/
[root@clent xtrabackup]# ls
bin  percona-xtrabackup-2.2-test
[root@clent xtrabackup]# cd bin/
[root@clent bin]# ls
innobackupex  xbcrypt  xbstream  xtrabackup
[root@clent bin]# cp * /usr/bin/
报错1:
[root@clent bin]# innobackupex
Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5

/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl

/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at

/usr/bin/innobackupex line 23.
BEGIN failed--compilation aborted at /usr/bin/innobackupex line 23.
解决方法: yum -y install perl-Time-HiRes

报错2:
[root@dbtest bin]# innobackupex --user=root --password=root --defaults-

file=/etc/my.cnf --socket=/tmp/mysql.sock  /home/backup_xtra

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

130608 10:22:29  innobackupex: Connecting to MySQL server with DSN

'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtra

backup;mysql_socket=/tmp/mysql.sock' as 'root'  (using password: YES).
ERROR: Failed to connect to MySQL server as DBD::mysql module is not

installed at /usr/bin/innobackupex line 1397.

解决方法:yum -y install perl-DBD-MySQL.x86_64

全备:
[root@clent data]# innobackupex --defaults-file=/data/mysql/my.cnf --user=root --password=xxxx  /tmp/test
执行完之后在最后输出可以看到

innobackupex: Backup created in directory '/tmp/test/2014-06-20_16-15-52'
innobackupex: MySQL binlog position: filename 'mysql-bin.000004', position

664
140620 16:15:55  innobackupex: Connection to database server closed
140620 16:15:55  innobackupex: completed OK!
全备还原:
关闭数据库服务
[root@clent data]#innobackupex --apply-log /tmp/mysql/2014-06-20_16-15-52
在创建全量备份后,备份文件是不能restore的,因为这个初始创建的备份只是简单的

copy过程,而innodb是事务引擎,所以还需要通过log文件replay committed的事务和回

滚uncommitted事务,这样数据库就达到一致的状态,可以restore了

[root@clent data]#innobackupex --defaults-file=/data/mysql/my.cnf  --copy-

back /tmp/mysql/2014-06-20_16-15-52/
(全备恢复数据的时候数据库原本的data目录要清空,若是怕数据丢失可以拷贝data文

件夹作为备份)
恢复数据之后修改data文件夹下数据库的文件所有者chown -R mysql:mysql *
若是有mysql-bin.index文件删除否则会造成mysql服务启动不起来

增量备份:
[root@clent data]#innobackupex --defaults-

file=/data1/app/services/mysql55/my.cnf  --user=root --password=1q2w3e4r --incremental-basedir=/tmp/mysql/2014-06-20_16-15-52/ --incremental /tmp/mysql

[root@clent data]#innobackupex --defaults-file=/data/mysql/my.cnf --user=root --password=1q2w3e4r --incremental-basedir=/tmp/mysql/2014-06-20_16-15-52/ --incremental /tmp/mysql

其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例

中为:/tmp/mysql/2014-06-20_16-22-37),在该目录下存放着增量备份的所

有文件。
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下


backup_type = incremental
from_lsn = 1602592
to_lsn = 1603468
last_lsn = 1603468
compact = 0

只要把--incremental-basedir执行上一次增量备份的目录,就可以在增量备份的基础上

再做增量备份

增量备份恢复:
增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志:
[root@clent data]#innobackupex --apply-log --redo-only /tmp/mysql/2014-06-20_16-15-52/
[root@clent data]#innobackupex --apply-log --redo-only /tmp/mysql/2014-06-20_16-15-52 --incremental-dir=/tmp/mysql/2014-06-20_16-22-37
[root@clent data]#innobackupex --apply-log  /tmp/mysql/2014-06-20_16-15-52 --incremental-dir=/tmp/mysql/2014-06-20_16-25-37

例子:
[root@clent data]#innobackupex --apply-log --redo-only BASE-DIR 
[root@clent data]#innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 
[root@clent data]#innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,

INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--

use_memory提高性能。
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。
第二步,回滚未完成的日志:
[root@clent data]#innobackupex --apply-log  /tmp/mysql/2014-06-20_16-15-52/
[root@clent data]#innobackupex --defaults-/data/mysql/my.cnf  --copy-back/tmp/mysql/2014-06-20_16-15-52/

innodbackupex --help (里面还是有很多可以使用的参数,有兴趣可以看一下)
--databases=LIST (选择数据库列表)

2.2版本官网document:http://www.percona.com/doc/percona-

xtrabackup/2.2/innobackupex/innobackupex_script.html
2.2版本官网installation:http://www.percona.com/doc/percona-

xtrabackup/2.2/installation/compiling_xtrabackup.html