MySQL备份工具XtraBackup安装及全量和增量备份与恢复测试

XtraBackup简介

Xtrabackup 是percona公司的一个开源项目,用以实现类似innodb官方的热备份工具InnoDB Hot Backup的功能,能够非常快速地备份与恢复mysql数据库,可以热备份innodb ,XtraDB,和MyISAM(会锁表)。

Xtrabackup中包含两个工具:xtrabackup和innobackupex。
Xtrabackup专门用于innodb引擎和 xtraDB引擎,xtrabackup是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构,备份时不会锁表;
而innobackupex是专门用于myisam和innodb引擎,及混合使用的引擎。如果你的数据库里有innodb和myisam存储引擎,只能使用innobackupex备份。innobackupex是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

由于innobackupex的功能更为全面和完善,所以,本文以innobackupex作为基础进行研究描述。
下面介绍xtrabackup的全量、增量的备份与恢复。

XtraBackup安装

XtraBackup的安装有以下几种方法:

rpm包安装及配置

安装以下依赖包:

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
下载rpm安装包:
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.7/binary/redhat/6/x86_64/percona-xtrabackup-debuginfo-2.2.7-5050.el6.x86_64.rpm
安装rpm包:
rpm -ivh --nodeps percona-xtrabackup-debuginfo-2.2.7-5050.el6.x86_64.rpm

–nodeps(不检查软件间的依赖关系),因为安装xtrabackup需要mysql_client,但是我的是通过源码安装的。所以环境变量要设置正确

比如 export PATH=$PATH:/usr/local/mysql/bin 如果mysql没有设置到PATH里 会报错。

查看版本号:
xtrabackup --version  
简单测试:
innobackupex --user=root --defaults-file=/etc/my.cnf --database=test /tmp  

卸载rpm包:
rpm -qa | grep xtrabackup  
rpm -e percona-xtrabackup-2.2.3-4982.el6.x86_64

官方文档:http://www.percona.com/doc/percona-xtrabackup/2.2/installation.html

YUM安装

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
yum list | grep percona
yum -y install percona-xtrabackup.x86_64

官方文档:http://www.percona.com/doc/percona-xtrabackup/2.2/installation/yum_repo.html

二进制执行文件安装及配置

安装以下依赖包:
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
下载二进制安装文件:
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.7/binary/tarball/percona-xtrabackup-2.2.7-5050-Linux-x86_64.tar.gz

解压安装包:
tar xzvf percona-xtrabackup-2.2.7-5050-Linux-x86_64.tar.gz  
查看版本号:
/root/percona-xtrabackup-2.2.7-Linux-x86_64/bin/innobackupex --version  

简单备份测试:
/root/percona-xtrabackup-2.2.7-Linux-x86_64/bin/innobackupex --user=root --defaults-file=/etc/my.cnf --database=test /tmp  

安装成功!

源码包编译安装及配置

下载二进制源码包:
方法1:
直接下载指定源码包

wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.7/source/tarball/percona-xtrabackup-2.2.7.tar.gz
tar -zxvf percona-xtrabackup-2.2.7.tar.gz
cd percona-xtrabackup-2.2.7

方法2:
通过bzr下载

yum install bzr  
bzr branch lp:percona-xtrabackup/2.2

安装依赖库

如果是Debian系列的话 
apt-get install build-essential flex bison automake autoconf bzr libtool cmake libaio-dev mysql-client libncurses-dev zlib1g-dev libgcrypt11-dev 
如果是RedHat系列的话 
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses5-devel 

开始编译

cmake -DBUILD_CONFIG=xtrabackup_release && make -j4

默认安装
make install
注:默认安装在/usr/local/xtrabackup/目录下

简单备份测试
/usr/local/xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=****** --database=test  /tmp 

指定目录安装:
make DESTDIR=/tmp/ install  
会安装在/tmp/usr/local/xtrabackup/目录下
	
查看版本号:
xtrabackup --version  

官方文档:http://www.percona.com/doc/percona-xtrabackup/2.2/installation/compiling_xtrabackup.html

MySQL设置备份用户

创建并授权MySQL数据库用户有备份权限

[root@localhost ~]# mysql -uroot -proot@pass
mysql> create user 'backup'@'localhost' identified by 'mypass';     #创建用户并设置密码
mysql> revoke all privileges,grant option from 'backup'@'localhost';#去掉用户的所有默认权限
mysql> grant reload,lock tables,replication client,event on *.* to 'backup'@'localhost';  #重新为用户授权
mysql> flush privileges;   #刷新使其重新授权表

注释: 用户授权规则为最小权限

innobackupex语法介绍

在实施备份时,需要在数据库运行的情况下在线执行,并先提前建立用于备份的路径。

innobackupex [--defaults-file=/etc/my.cnf] –user=root [--host=192.168.10.198] [--password=xxx] [--port=3306] /www/backup/ 2>/www/backup/backup.log

参数:
/www/backup/ #备份的目录

2>/www/backup/backup.log #将备份过程中的输出信息重定向到/www/backup/backup.log

–slave-info #会记录复制主日志的复制点,便于重新做复制用。(用在备份从机器用)

xtrabackup_binlog_info #存放binlog的信息。(binlog需要另外拷贝备份,如果需要binlog的话)

xtrabackup_checkpoints #存放备份的起始位置和结束位置。

–-stream=tar #告诉xtrabackup,备份需要以tar的文件流方式输出。

–-include=’test’ #备份包含的库表,如例:意思是要备份test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:tableA & tableB,则写成:–-include=’test.tableA|test.tableB’;再如果test库下只有2个前缀是 table的表,你还可以写成:–-include=’test.table*’。

–-throttle=500 #xtrabackup在备份过程中,IO操作比较多,因此需要限定一下IO操作。以免服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测…

–-socket=/data/mysql/backup/mysql.sock #指定mysql.sock所在位置,以便备份进程登录mysql

–apply-log

–redo-only

全量备份命令示例:

innobackupex --defaults-file=/etc/my.cnf /www/backup/

将在/www/backup/ 目录下产生一个按当前日期时间命令的目录,如 2012-07-18_15-05-06,在恢复时,注意要先关闭服务器,并且将 datadir 的目录先清空,在恢复数据后一定需要重置该目录的权限。

模拟故障,具体操作如下:

/usr/local/mysql5/bin/mysqladmin  -uroot shutdown
mv /www/mysqldata  /tmp/
mkdir /www/mysqldata

应用全量备份命令示例:
innobackupex --apply-log /www/backup/2012-07-18_15-05-06/
innobackupex --copy-back /www/backup/2012-07-18_15-05-06/
chown -R mysql.mysql /www/mysqldata

备份时直接压缩命令示例:
备份时直接压缩以节约磁盘空间:

innobackupex --defaults-file=/etc/my.cnf --stream=tar /www/backup/ | gzip > /www/backup/compress/mysql_backup.tar.gz

不过注意解压需要手动进行,并加入 -i 的参数,否则无法解压出所有文件。

tar zxfi /www/backup/compress/mysql_backup.tar.gz
innobackupex --apply-log /www/backup/compress
innobackupex --copy-back /www/backup/compress

对某个数据库进行全部备份的命令示例:

innobackupex --user=root --password=123456 --defaults-file=/etc/mysql/my.cnf --database=test --stream=tar /tmp/data/ 2>/tmp/data/err.log|gzip 1>/tmp/data/test.tar.gz

说明:
–database=test 单独对test数据库做备份 ,若是不添加此参数那就是对全库做备份
2>/tmp/data/err.log 输出信息写入日志中
1>/tmp/data/test.tar.gz 打包压缩存储到该文件中

数据库的全量备份与恢复测试

下面开始测试xtrabackup的全量备份

创建测试数据库

先进入mysql里创建一个新的test数据库

root@client2:/tmp# mysql -u root -p   
mysql> drop database test;   
mysql> create database test;   
mysql> use test;   
mysql> create table test (id int);   
mysql> insert into test values(1);   
mysql> insert into test values(2);  
mysql> insert into test values(3);  
mysql> insert into test values(4);   
mysql> insert into test values(5); 
mysql> select * from test;   
+------+   
| id   |   
+------+   
|    1 |   
|    2 |   
|    3 |   
|    4 |   
|    5 |   
+------+   
5 rows in set (0.00 sec)     
mysql> flush privileges;   

全量备份测试数据库

备份test的整个数据库 使用下面的backup.sh脚本

root@client2:/tmp# cat backup.sh    

#!/bin/bash   
user='root'  
passwd='123456'  
database=test  
my_config='/etc/mysql/my.cnf'  
log=$database-$(date +%Y%m%d%H%M).log   
str=$database-$(date +%Y%m%d%H%M).tar.gz   
backup_dir='/tmp/data'  
echo "Start to backup at $(date +%Y%m%d%H%M)"   
if [ ! -d "$backup_dir" ];then    
    mkdir $backup_dir   
fi   
innobackupex --user=$user --password=$passwd --defaults-file=$my_config --database=$database --stream=tar $backup_dir 2>$backup_dir/$log | gzip 1>$backup_dir/$str   
if [ $? -eq 0 ];then   
    echo "Backup is finish! at $(date +%Y%m%d%H%M)"   
    exit 0   
else   
    echo "Backup is Fail! at $(date +%Y%m%d%H%M)"    
    exit 1   
fi   

赋予脚本执行权限
chmod +x backup.sh
现在开始运行此脚本 
root@client2:/tmp# sh backup.sh    
Start to backup at 201303072101   
Backup is finish! at 201303072102   
然后到data里查看结果 
root@client2:/tmp# cd data   
root@client2:/tmp/data# ll   
total 3272   
drwxr-xr-x  2 root root    4096 Mar  7 21:01 ./   
drwxrwxrwt 13 root root    4096 Mar  7 21:02 ../   
-rw-r--r--  1 root root    3780 Mar  7 21:02 test-201303072101.log   
-rw-r--r--  1 root root 3336909 Mar  7 21:02 test-201303072101.tar.gz   
root@client2:/tmp/data# cat test-201303072101.log      
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy   and Percona Inc 2009-2012.  All Rights Reserved.     
……(略)
130307 21:02:06  innobackupex: completed OK!

可以看到备份完成了

注释:备份完成后,会在”/tmp/data”目录下生成一个以当前日期时间为名称的目录;使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。当然在备份时”innobackupex”还会在备份目录中生成一些文件如:

1、xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的

2、xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置

3、xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position

4、xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件

5、backup-my.cnf —— 备份命令用到的配置选项信息

6、使用innobackupex进行备份时,还可以使用”–no-timestamp”选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据

恢复数据库

先关闭mysql服务,然后再删除test数据库文件

root@client2:/tmp/data# service mysql stop  
root@client2:/tmp/data# cd /var/lib/mysql/   
root@client2:/var/lib/mysql# rm -rf test

开始恢复数据库
先把之前/tmp/data里的数据库压缩版给解压

root@client2:cd /tmp/data
root@client2:/tmp/data# tar -izxvf test-201303072101.tar.gz -C /tmp/restore/

注意:这里tar解包必须使用-i参数,否则解压出来的文件只有一个backup-my.cnf
查看一下restore的内容

root@client2:/tmp/data# cd /tmp/restore/
root@client2:/tmp/restore# ll

一般情况下,上文中直接备份的数据是不能用于恢复的,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件处于不一致的状态,我们现在就是要通过回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态。
将备份文件中的日志应用到备份文件中的数据文件上

root@client2:/tmp/restore# innobackupex --user=root --password=123456 --apply-log /tmp/restore/

这里的–apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中:
然后再查看一下当前目录内容

root@client2:/tmp/restore# ll   
……(略)
drwxr-xr-x  2 root  root      4096 Mar  7 21:03 test/   
……(略)
然后把test目录复制到/var/lib/mysql目录   
root@client2:/tmp/restore# rsync -avz test ib* /var/lib/mysql/   
root@client2:/tmp/restore# cd /var/lib/mysql/   
root@client2:/var/lib/mysql# ll   
……(略)
drwxr-xr-x  2 root  root      4096 Mar  7 21:03 test/   
……(略)
然后再修改test的用户与组为mysql 
root@client2:/var/lib/mysql# chown -R mysql:mysql test   

root@client2:/var/lib/mysql# ll
……(略)
drwxr-xr-x  2 mysql mysql     4096 Mar  7 21:03 test/
……(略)
然后启动mysql,并查看test数据库的表里内容 
root@client2:/var/lib/mysql# service  mysql start  
root@client2:/var/lib/mysql# mysql -u root -p   
mysql> use test;   
mysql> select * from test;   
+------+   
| id   |   
+------+   
|    1 |   
|    2 |   
|    3 |    
|    4 |   
|    5 |   
+------+   
5 rows in set (0.01 sec)

可以看到数据库已经恢复完成
可能大家有个疑问,为什么我这里不像很多网上的文章里是在apply-log后,使用copy-back
如果使用/usr/bin/innobackupex –copy-back命令后,会报Original data directory is not empty! at /usr/local/xtrabackup/bin/innobackupex line 538.恢复的目录必须为空。经查官网,这是xtrabackup的一个BUG。
innobackupex–copy-back was run. With this bug fix, innobackupex–copy-back operation if the destination is not empty, avoiding potential data loss or a strang combination of a restored backup and previous data. Bug Fixed: #737569 (Valentine Gostev) will now error out of the did not check that MySQL datadir was empty before
所以在apply-log后直接复制数据目录到数据库的位置上吧。

数据库的增量备份与恢复

为了进行增量备份,先对数据库添加一些数据

mysql> insert into test values(11);    
mysql> insert into test values(12);    
mysql> insert into test values(13);   
mysql> insert into test values(14);    
mysql> insert into test values(15);    
mysql> flush privileges;   
Query OK, 0 rows affected (0.01 sec)     
mysql> select * from test;   
+------+   
| id   |   
+------+   
|    1 |   
|    2 |   
|    3 |   
|    4 |   
|    5 |   
|   11 |   
|   12 |   
|   13 |   
|   14 |   
|   15 |   
+------+   
10 rows in set (0.00 sec)   
然后进行增量的备份   
root@client2:/var/lib/mysql# innobackupex --user=root --password=123456 --database=test --incremental /tmp/data --incremental-basedir=/tmp/restore/

其中,–incremental指明增量备份文件存放的位置,–incremental-basedir指定上次完整备份或者增量备份文件的位置。
需要注意的是:
1、在执行过增量备份之后再一次进行增量备份时,其–incremental-basedir应该指向上一次的增量备份所在的目录。
2、这里的增量备仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
3、如果默认存储引擎是基于MyISAM,那么增量备份时备份的文件分别是.frm、.MYD、.MYI。
如果默认存储引擎是基于InnoDB,那么增量备份时备份的只会是.frm文件(此处未验证)

在进行增量备份的恢复之前,先关闭数据库,然后删除test数据库

root@client2:/var/lib/mysql# service mysql stop   
root@client2:/var/lib/mysql# rm -rf test
root@client2:/var/lib/mysql# ll
增量备份的恢复 
root@client2:/var/lib/mysql# innobackupex -user=root --password=123456 --defaults-file=/etc/mysql/my.cnf --apply-log /tmp/restore/ --incremental-dir=/tmp/data/2013-03-07_21-13-44/     
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy   and Percona Inc 2009-2012.  All Rights Reserved.     
……(略)
130307 21:18:34  innobackupex: completed OK!   
然后再进入恢复的目录/tmp/data 
root@client2:/var/lib/mysql# cd /tmp/data   
root@client2:/tmp/data# ll   
total 3276   
drwxr-xr-x  3 root root    4096 Mar  7 21:13 ./   
drwxrwxrwt 14 root root    4096 Mar  7 21:18 ../   
drwxr-xr-x  3 root root    4096 Mar  7 21:18 2013-03-07_21-13-44/   
-rw-r--r--  1 root root    3780 Mar  7 21:02 test-201303072101.log   
-rw-r--r--  1 root root 3336909 Mar  7 21:02 test-201303072101.tar.gz   
root@client2:/tmp/data# cd 2013-03-07_21-13-44/   
root@client2:/tmp/data/2013-03-07_21-13-44# ll   
total 2288   
drwxr-xr-x 3 root root    4096 Mar  7 21:18 ./   
drwxr-xr-x 3 root root    4096 Mar  7 21:13 ../   
-rw-r--r-- 1 root root     260 Mar  7 21:13 backup-my.cnf   
-rw-r--r-- 1 root root  212992 Mar  7 21:13 ibdata1.delta   
-rw-r--r-- 1 root root      18 Mar  7 21:13 ibdata1.meta   
drwxr-xr-x 2 root root    4096 Mar  7 21:14 test/   
-rw-r--r-- 1 root root      13 Mar  7 21:14 xtrabackup_binary   
-rw-r--r-- 1 root root      23 Mar  7 21:14 xtrabackup_binlog_info   
-rw-r--r-- 1 root root      84 Mar  7 21:14 xtrabackup_checkpoints   
-rw-r--r-- 1 root root 2097152 Mar  7 21:18 xtrabackup_logfile   
跟全部备份一样,把test恢复到/var/lib/mysql里
root@client2:/tmp/data/2013-03-07_21-13-44# rsync -avz test ib* /var/lib/mysql/  
root@client2:/tmp/data/2013-03-07_21-13-44# cd /var/lib/mysql/   
root@client2:/var/lib/mysql# ll   
……(略)
drwxr-xr-x  2 root  root      4096 Mar  7 21:14 test/  
……(略)
然后修改用户与组 
root@client2:/var/lib/mysql# chown -R mysql:mysql test/   
root@client2:/var/lib/mysql# ll
……(略)
drwxr-xr-x  2 mysql mysql     4096 Mar  7 21:14 test/
……(略)
然后启动msyql,并查看test数据库里test表的内容 
root@client2:/var/lib/mysql# service mysql start   
root@client2:/var/lib/mysql# mysql -u root -p
mysql> use test;
mysql> select * from test;   
+------+   
| id   |   
+------+   
|    1 |   
|    2 |   
|    3 |   
|    4 |   
|    5 |   
|   11 |   
|   12 |   
|   13 |   
|   14 |   
|   15 |   
+------+   
10 rows in set (0.00 sec)

可以看到增量备份已经恢复完成。

增量备份,如果需要恢复的话需要做如下操作

[root@Web1 ~]# innobackupex --apply-log --redo-only /data/backup/2014-06-30_11-33-24
[root@Web1 ~]# innobackupex --apply-log --redo-only /data/backup/2014-06-30_11-33-24 --incremental-dir=/data/backup/2014-06-30_13-06-25

如果存在多次增量备份的话,就需要多次执行。如

innobackupex --apply-log --redo-only BACKUPDIR 
innobackupex --apply-log --redo-only BACKUPDIR --incremental-dir=INCREMENTDIR-1
innobackupex --apply-log --redo-only BACKUPDIR --incremental-dir=INCREMENTDIR-2

BACKUP是全备目录,INCREMENTDIR是增量备份目录,上面是有2次增量备份,如果存在多次增量备份,则需要多次运行如上的命令

Xtrabackup的备份压缩

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用–stream选项即可。如:

innobackupex --user=root --password=123456 --stream=tar  /data/backup | gzip > /data/backup/`date +%F_%H-%M-%S`.tar.gz

附录:
1、经验之谈:
A:恢复一个4G数据文件的数据库的时候,恢复的数据是使用mysqldump的数据,恢复了3个小时还没有反应,造成的影响很严重
使用xtrabackup来进行备份与恢复,恢复4G数据文件的数据库,仅需要14秒,同时在备份的时候不会锁表,而且支持增量备份。

B:用Xtrabackup全备数据,用blackhole增备binlog,并定期对备份数据的有效性进行验证,是当下比较好的选择。

扩展阅读:
企业之Mysql备份恢复:http://502245466.blog.51cto.com/7559397/1291913
CentOS 6.5下Percona Xtrabackup的安装及使用:http://fengwan.blog.51cto.com/508652/1432347/
多实例下percona-xtrbackup使用(2014-11-10):http://www.2cto.com/database/201411/351118.html
使用mysqldump模拟生产环境实现mysql数据库的备份与还原:http://www.it165.net/database/html/201305/3871.html
Mysql备份工具xtraback全量和增量测试:http://blog.chinaunix.net/uid-25266990-id-3314699.html
xtrabackup对MySQL进行备份和恢复的全过程:http://blog.chinaunix.net/uid-23914782-id-3353945.html(主要参考备份脚本)
在线备份MySQL及远程copy到远程备份服务器shell脚本:http://blog.chinaunix.net/uid-25723371-id-3241683.html(主要参考mysqldump备份脚本)
MySQL多线程逻辑备份与恢复:http://www.51itstudy.com/30191.html(了解Mydumper的用法)
MySQL/MariaDB数据备份与数据恢复完整:http://www.3lian.com/edu/2014/05-05/145447.html(了解备份的概念及通过mysqlbinlog恢复备份的方法)
MySQL备份恢复方案:http://blog.csdn.net/mysqldbd/article/details/6138518(参考各种故障恢复的方案)

参考资料:
XtraBackup官方网址:http://www.percona.com/docs/wiki/percona-xtrabackup:start
生产环境究竟是使用mysqldump还是xtrabackup来备份与恢复数据库:http://wenku.baidu.com/view/7b66a83983c4bb4cf7ecd1d6.html
Mysql备份工具xtraback全量和增量测试:http://blog.chinaunix.net/uid-25266990-id-3314699.html
mysql备份还原-centos6.5下安装xtrabackup2.2.3(二进制,源码包,rpm包安装方式汇总):http://blog.csdn.net/jesseyoung/article/details/41577461

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据