Xtrabackup备份和恢复MySQL(下)

作者:周振兴 mail
来自:supu@TaobaoDBA 2009年10月13日星期二
摘要:上篇中我们介绍了Xtrabackup的编译安装,以及如何使用innobackupex来备份和恢复数据库。本文将继续介绍Xtrabackup中的另一个工具xtrabackup(二进制脚本)。innobackupex对xtrabackup进行了封装可以同时备份InnoDB和MyISAM数据表,在备份MyISAM表时会进行全局锁表,如果单独使用xtrabackup,我们不仅可以实现真正的“在线”备份,还可以进行增量备份InnoDB。本文将介绍如何单独使用xtrabackup来备份你的InnoDB数据。(本文PDF版本:上篇 下篇

+++++++++++++++++++++++++++++++++
正文:
+++++++++++++++++++++++++++++++++

一、 使用说明

本文测试环境同上篇

1. 备份

InnoDB配置说明:

innodb_data_home_dir = ./
innodb_data_file_path = ibdata1:50M:autoextend
innodb_log_group_home_dir = ./
innodb_log_files_in_group = 4
innodb_log_file_size = 104857600

备份命令:

$xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/u01/xtrabackup/1/
……
$cd /u01/xtrabackup/1/ && ls
ibdata1 test xtrabackup_checkpoints xtrabackup_logfile

2. 恢复

需要执行两次xtrabackup --prepare

$xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/u01/xtrabackup/1/
……
$xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/u01/xtrabackup/1/
……
$cd /u01/xtrabackup/1/ && ls
ibdata1 ib_logfile0 ib_logfile1 ib_logfile2 ib_logfile3 test xtrabackup_checkpoints xtrabackup_logfile

这时候,InnoDB的全部数据文件就已经恢复了。将这些数据文件,拷贝回你的MySQL数据文件的位置就可以了。需要注意的是,xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm)。

二、 增量备份

对比innobackupex和xtrabackup我们可以看到,innobackupex操作起来更方便,但是innobackupex会有短暂的锁表(时间依赖于MyISAM大小)。xtrabackup备份还有另一个重要特性:增量备份。(未来的版本innobackupex也可能增长该功能)

1. 全量备份

$xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/u01/xtrabackup/2/
……
$ls /u01/xtrabackup/2/
ibdata1 test xtrabackup_checkpoints xtrabackup_logfile

2. 增量备份

$xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/u01/xtrabackup/2.1/ --incremental-basedir=/u01/xtrabackup/2/
……
$ls /u01/xtrabackup/2.1/
ibdata1.delta test xtrabackup_checkpoints xtrabackup_logfile

在增量备份的目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份之后被修改过的page,所以增量备份一般只暂用较少的空间。

$cd /u01/xtrabackup/ && du --max-depth=1 -h
428K ./2.1
935M ./2

3. 增量备份恢复

我们需要分别对全量、增量备份各做一次prepare操作。

$xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/u01/xtrabackup/2/
……
$xtrabackup --prepare --target-dir=/u01/xtrabackup/2/ --incremental-dir=/u01/xtrabackup/2.1/
……
$xtrabackup --prepare --target-dir=/u01/xtrabackup/2/ #这一步不是必须的

这样,/u01/xtrabackup/2/下的数据文件就可以直接放到你的MySQL数据目录下,恢复数据了。

再次提醒,xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)。

参考文献
[1]. http://www.percona.com/docs/wiki/percona-xtrabackup:start

7 responses to “Xtrabackup备份和恢复MySQL(下)”

  1. Green Tea

    为什么恢复的时候要执行两遍?

  2. In current version, you should execute –prepare second time if you want to create ib_logfile* (This is restriction of the alpha version)

  3. AliceLi

    请问这个 Xtrabackup的工具,能备份单个数据库吗?
    看了一下备份的参数,貌似没有指定哪个库的。

  4. 我并不确定 我想应该可以,因为innobackupex的参数列表中有一个相关参数:[–include=REGEXP] 参考 http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual

  5. AliceLi

    谢了,实践过了,可以部分备份,备份多个表。

  6. gary

    谢谢,楼主写得很周到.
    第一篇我测试了.

  7. 楼主QQ多少,可否加我QQ
    175268401
    有个问题想请教

Leave a Reply

Your email address will not be published. Required fields are marked *