bitscn.com
[mysql] innobackupex在线备份及恢复(全量和增量)
安装
声明:以下操作最好以mysql用户执行。
首先,通过wget下载源码tar包:
[plain]
wget http://www.percona.com/redir/downloads/xtrabackup/latest/source/percona-xtrabackup-2.1.5.tar.gz
安装依赖包:
[plain]
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel
解压缩tar:
[plain]
tar -zxvf percona-xtrabackup-2.1.5.tar.gz
cd percona-xtrabackup-2.1.5
utils/build.sh脚本会根据指定的引擎版本,自动解压缩适当的mysql源码包并进行编译,这是最简单的安装方式。当你在命令行下不带任何参数执行该脚本时,出现如下提示:
[plain]
[mysql@epay100 ~/software/percona-xtrabackup-2.1.5 ]$ ./utils/build.sh
build an xtrabackup binary against the specified innodb flavor.
usage: build.sh codebase
where codebase can be one of the following values or aliases:
innodb51 | plugin build against innodb plugin in mysql 5.1
innodb55 | 5.5 build against innodb in mysql 5.5
innodb56 | 5.6,xtradb56, build against innodb in mysql 5.6
| mariadb100
xtradb51 | xtradb,mariadb51 build against percona server with xtradb 5.1
| mariadb52,mariadb53
xtradb55 | galera55,mariadb55 build against percona server with xtradb 5.5
根据上面提示和你使用的存储引擎及版本,选择相应的参数即可。因为我用的是mysql 5.6,所以执行如下语句安装:
[plain]
./utils/build.sh innodb56
以上语句执行成功后,表示安装完成。最后,把生成的二进制文件拷贝到一个自定义目录下(本例中为/home/mysql/admin/bin/percona-xtrabackup-2.1.5),并把该目录放到环境变量path中。
[plain]
cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.5
cp ./src/xtrabackup_56 ./src/xbstream /home/mysql/admin/bin/percona-xtrabackup-2.1.5
全备及其恢复
全备:
执行如下语句进行全备:
[plain]
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** /backup/mysql/data
该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/backup/mysql/data),注意:如果不指定--defaults-file,默认值为/etc/my.cnf。
备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data/2013-10-29_09-05-25),在该目录下存放备份文件。
恢复:
[plain]
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --use-memory=4g --apply-log /backup/mysql/data/2013-10-29_09-05-25
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --copy-back /backup/mysql/data/2013-10-29_09-05-25
从什么可以看出,恢复分为两个步骤,第1步是apply-log,为了加快速度,一般建议设置--use-memory,这个步骤完成之后,目录/backup/mysql/data/2013-10-29_09-05-25下的备份文件已经准备就绪。
第2步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,一定要记得检查数据目录的所有者和权限是否正确。
增量备份及其恢复
注意:innobackupex 增量备份仅针对innodb这类支持事务的引擎,对于myisam等引擎,则仍然是全备。
增量备份:
增量备份需要基于全备,先假设我们已经有了一个全备(/backup/mysql/data/2013-10-29_09-05-25),在该全表的基础上做增量备份。
[plain]
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql/data/2013-10-29_09-05-25 --incremental /backup/mysql/data
其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2013-10-29_09-52-37),在该目录下存放着增量备份的所有文件。
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
[plain]
backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914
基于该全备的增量备份的信息如下:
[plain]
backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:
[plain]
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql/data/2013-10-29_09-52-37 --incremental /backup/mysql/data
它的xtrabackup_checkpoints记录着备份信息如下:
[plain]
backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950
可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。
恢复:
增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:
[plain]
innobackupex --apply-log --redo-only base-dir
innobackupex --apply-log --redo-only base-dir --incremental-dir=incremental-dir-1
innobackupex --apply-log base-dir --incremental-dir=incremental-dir-2
其中base-dir是指全备目录,incremental-dir-1是指第一次的增量备份,incremental-dir-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。
以上语句执行成功之后,最终数据在base-dir(即全备目录)下。
第一步完成之后,我们开始第二步:回滚未完成的日志:
[plain]
innobackupex --apply-log base-dir
上面执行完之后,base-dir里的备份文件已完全准备就绪,最后一步是拷贝:
[plain]
innobackupex --copy-back base-dir
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。
常见错误及解决方法
错误:
[plain]
131028 17:45:57 innobackupex: connecting to mysql server with dsn 'dbi:mysql:;mysql_read_default_group=xtrabackup' (using password: no).
innobackupex: error: failed to connect to mysql server as dbd::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.5/innobackupex line 2913.
解决方法:
[plain]
yum -y install perl-dbd-mysql.x86_64
bitscn.com