MySQL innobackupex在线备份及恢复(全量和增量)

Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品。Xtrabackup由个部分组成:xtrabackup和innobackupex,其中xtrabackup工具用于备份innodb和 xtraDB引擎的表;而innobackupex工具用于备份myisam和innodb引擎的表,本文将介绍如何用innobackupex工具做全量和增量备份。

Xtrabackup安装可以参考我之前写的文章

http://blog.csdn.net/saga_gallon/article/details/51897844


全备及其恢复

全备:
执行如下语句进行全备:
[root@localhost lib]# innobackupex --defaults-file=/etc/my.cnf  --user=root --password=*** /root/mysqlback/

该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/ root/mysqlback/
备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/root/mysqlback/2016-07-19_03-59-36),在该目录下存放备份文件

恢复:
恢复之前,要先关闭数据库,并且删除数据文件和日志文件。
[root@localhost mysqlback]# systemctl stop mariadb.service
[root@localhost mysqlback]# cd /var/lib/
[root@localhost lib]# rm -rf mysql

[root@localhost lib]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --apply-log /root/mysqlback/2016-07-19_03-59-36/
[root@localhost lib]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --copy-back /root/mysqlback/2016-07-19_03-59-36/

从什么可以看出,恢复分为两个步骤,第1步是apply-log,为了加快速度,一般建议设置--use-memory,这个步骤完成之后,目录/backup/mysql/data/2013-10-29_09-05-25下的备份文件已经准备就绪。
第2步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,一定要记得检查数据目录的所有者和权限是否正确。


增量备份及其恢复

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

增量备份:
增量备份需要基于全备,先假设我们已经有了一个全备( /root/mysqlback/2016-07-19_03-59-36),我们需要在该全备的基础上做增量备份。
[root@localhost lib]#innobackupex --defaults-file=/etc/my.cnf -user=root --password=*** --incremental-basedir=/root/mysqlback/2016-07-19_03-59-36/ --incremental /root/mysqlback/
其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:/root/mysqlback/2016-07-19_17-39-37),在该目录下存放着增量备份的所有文件。
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
backup_type = incremental
from_lsn = 1819977
to_lsn = 1820222
last_lsn = 1820222
compact = 0
~               

基于该全备的增量备份的信息如下
backup_type = full-prepared
from_lsn = 0
to_lsn = 1819977
last_lsn = 1819977
compact = 0


从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示
[root@localhost mysqlback]# innobackupex --defaults-file=/etc/my.cnf -user=root --password=*** --incremental-basedir=/root/mysqlback/2016-07-19_17-29-07/ --incremental /root/mysqlback/
它的xtrabackup_checkpoints记录着备份信息如下:

backup_type = incremental
from_lsn = 1820222
to_lsn = 1820222
last_lsn = 1820222
compact = 0
~              
可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。
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(即全备目录)下。
第一步完成之后,我们开始第二步:回滚未完成的日志:
[root@localhost ]# innobackupex --apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:
[root@localhost ]#innobackupex --copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。

你可能感兴趣的:(Mysql,备份还原)